Django视图
# 1.CBV和FBV
- FBV -- function based view 函数视图
- CBV -- class based view 类视图
CBV应用
#定义 from django.views import View class AddPublisher(View): #在views中创建好类,在url中调用的时需要在类名之后加上.as_view()方法 def get(self,request): """处理get请求""" return response def post(self,request): """处理post请求""" return response #使用 url(r'^add_publisher/', views.AddPublisher.as_view()),
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17as_view()方法的执行的流程
#源码as_view()
1.项目启动时,加载url.py时,执行 类.as_view() ,返回一个view函数 #类中包含view函数; 2.请求到来的时候执行view函数: (1)函数实例化自定义的类,并赋值给self # self = cls(**initkwargs) 并执行 # self.request = request (2)view函数调用dispatch方法, #self.dispatch(request, *args, **kwargs) (3)在dispatch中,判断请求方式是否存在(被允许): - 允许(存在):,通过反射获取到与请求方式对应的方法,然后赋值给 handler - 不允许(不存在):handler = self.http_method_not_allowed (4)在disparch执行完毕后执行handler #handler() - 把返回值返回给浏览器
1
2
3
4
5
6
7
8
9
10FBV视图加装饰器
- 直接加在对应的函数方法之上,无特殊性
CBV加装饰器
使用method_decorator之前首先要导入from django.utils.decorators import method_decorator模块,使用方法:@method_decorator(装饰器)
加在方法上
from django.utils.decorators import method_decorator # 导入模块 --decorator 装饰 @method_decorator(timer) def get(self, request, *args, **kwargs): """处理get请求"""
1
2
3
4
5加在dispatch上
#加在自定义的dispatch方法之上 @method_decorator(timer) def dispatch(self, request, *args, **kwargs): #类中自定义dispatch方法 # print('before') ret = super().dispatch(request, *args, **kwargs) # 找到父级dispatch方法运行 # print('after') return ret
1
2
3
4
5
6
7加载类上(推荐)
加在父类上
#直接加在父类的dispath方法之上!!! @method_decorator(timer,name='dispatch') # decorator 装饰 dispatch调度 class AddPublisher(View):
1
2
3加在本身类上
@method_decorator(timer,name='post') @method_decorator(timer,name='get') class AddPublisher(View): def get(self,request)... def post(self,request)...
1
2
3
4
5
#使用method加装饰器和不使用时加装饰器的区别(了解) #不适用method_decorator func ——》 <function AddPublisher.get at 0x000001FC8C358598> args ——》 (<app01.views.AddPublisher object at 0x000001FC8C432C50>, <WSGIRequest: GET '/add_publisher/'>) #第一个参数不是request #使用method_decorator之后: func ——》 <function method_decorator.<locals>._dec.<locals>._wrapper.<locals>.bound_func at 0x0000015185F7C0D0> args ——》 (<WSGIRequest: GET '/add_publisher/'>,) #第一个参数是request
1
2
3
4
5
6
7
8
9
# 2.request对象
属性
# 属性 request.methot 获取当前请求方式 GET request.GET 获取url上携带的参数 request.POST 获取POST请求提交的数据 request.path_info 获取URL的路径 不包含ip和端口 不包含参数 request.body 获取请求体 b'' request.FILES 获取上传的文件 request.META 获取请求头 request.COOKIES cookie (待讲解) request.session session (待讲解)
1
2
3
4
5
6
7
8
9
10
11方法
# 方法 request.get_host() 获取主机的ip和端口 request.get_full_path() 获取URL的路径 不包含ip和端口 包含参数 request.is_ajax() 判断是都是ajax请求
1
2
3
4from表单上传文件注意事项:
把input标签的type设置为file,并设置name
from表单中加入属性 enctype="multipart/form-data"
<form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="f"> <bottun>上传</bottun> </form>
1
2
3
4
5在服务器获取
使用request.FILE.get('name'),方法获取上传的文件对象
使用f.chunks()获取文件对象的值
文件对象具有name属性
class Upload(View): def get(self, request): return render(request, 'upload.html') def post(self, request): f = request.FILES.get('f') #获取文件对象 with open(f.name, mode='wb')as F: for i in f.chunks(): #读取内容 F.write(i) return render(request, 'upload.html')
1
2
3
4
5
6
7
8
9
10
11
# 3.response 对象
#需要事先导入模块 from django.shortcuts import render, redirect, HttpResponse
- HttpResponse('字符串') -默认属性-(**content-type='text/html')
- 返回字符串
- render(request,'模板的文件名',{k1:v1})
- 返回一个完整的HTMl文件
- redirect('重定向的地址')
- 重定向 ,本质是返回一个 location: 地址 --响应头地址
#需要事先导入模块from django.http.response import JsonResponse
- JsonResponse 把字典或者列表序列化之后再返回
- JsonResponse({}) 字典序列化返回 -默认属性-(content-type='application/json')
- JsonResponse([],safe=False) 列表序列化返回,要把safe的值设为False
上次更新: 2023/04/16, 18:35:33