Django基础之视图层

内容概要

  • 小白必会三板斧
  • request对象方法初识
  • form表单上传文件
  • Jsonresponse
  • FBV与CBV

内容详细

小白必会三板斧

1
2
3
4
5
6
HttpResponse
render
redirect
# 视图函数必须返回一个HttpResponse对象

# 具体参考HttpResponse源码

request方法初识

1
2
3
4
5
6
7
8
9
10
11
12
13
'''
request对象:(
1:request.method(判断请求格式)
2:request.POST(.get、.getlist)
3:request.GET(.get、.getlist)
4:request.body(一串二进制)
5:request.files(接收文件)
6:request.path
7:request.path_info
8:request.get_full_path(接收完整url及?号后面的参数)
...

'''

form表单上传文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
必须要指定的参数
1.method='post'
2.enctype='/multipart/form-data/'
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="myfile" multiple>
<input type="submit" class="btn btn-primary btn-block">
</form>

def index(request):
if request.method == 'POST':
# print(request.POST)
# print(request.GET)
# print(request.FILES) # 获取文件数据
file_obj = request.FILES.get('myfile')
print(file_obj.name) # 获取文件名
with open(file_obj.name,'wb') as f:
for chunk in file_obj.chunks():
f.write(chunk)
return render(request,'index.html')

Jsonresponse

1
2
3
JsonRespanse:(
return JsonRespanse(dict)(默认只能传字典,需要传其他类型需要将safe参数改为False

FBV与CBVFBV 基于函数的视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
    FBV使用频率较低(基础阶段)
CBV 基于类的视图
CBV实际开发项目使用频率较高(高级阶段)
views.py视图层
视图函数
不仅仅可以是函数也可以是类
1.面向过程式编程
2.面向对象式编程

# FBV
def index(request):
return HttpResponse('')
# CBV
视图层代码
from django.views import View


class Mylogin(View):
def get(self,request):
return HttpResponse('get方法')
def post(self,request):
return HttpResponse('post方法')
路由层代码
url(r'^login/', views.Mylogin.as_view())
========================================================
CBV:
url(r'^index/',views.类名.as_view())

FBV:

url(r^index/',views.视图函数名)



1:as_view()里面返回了一个view函数(所以CBV本质也是FBV)

2:匹配路由调用view时,view里面生成了一个当前类(自己写的类)的对象,并返回了一个dispatch方法

3:dispatch方法里判断了当前请求的格式并将其变形成全小写的字符串,再判断当前请求格式是否合法,如果合法,就将该字符串通过反射方法将其调用并返回(get、post)---> def get:.../def post:...



CBV的本质也是和FBV一样,都是路由+视图函数内存地址



=====================================



CBV添加装饰器的三种方式:(先导入method_decorader模块)



1:放方法头上(指名道姓)



2:放他父类头上(可针对性的加装饰器,扩展性强)



3:重写dispatch方法(放dispatch头上)(作用于所有方法)



FBV:导入:from django.view.decorators.csrf import csrf_protect,csrf_exempt



csrf_protect:需要校验



csrf_exempt:忽视校验







正常添加装饰器即可







CBV:csrf_protect:可以正常按CBV三种添加方式



csrf_exempt:只能在dispath上加装饰器

CBV源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 切入点
url(r'^login/', views.Mylogin.as_view())
'''类名点名字还加括号 名字要么是绑定给类的方法 要么是无参函数'''

1.as_view()绑定给类的方法
@classonlymethod
def as_view(cls, **initkwargs)
2.CBV路由匹配本质与FBV一致
# CBV
url(r'^login/', views.Mylogin.as_view())
# CBV本质
# url(r'^login/', views.view)
3.匹配成功之后执行view函数代码
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
4.查看dispatch方法(对象查找属性和方法一定要严格按照顺序来)
def dispatch(self, request, *args, **kwargs):
# 判断当前请求方法是否符合八个默认的请求方法中
# 1.get
if request.method.lower() in self.http_method_names:
# getattr(对象,'get','拿不到的报错信息') >>> Mylogin里面的get方法
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # get(request,...)

img