Django基础之视图层
内容概要
-
小白必会三板斧
- request对象方法初识
-
form表单上传文件
-
Jsonresponse
-
FBV与CBV
内容详细
1 小白必会三板斧
HttpResponse render redirect # 视图函数必须返回一个HttpResponse对象 # 具体参考HttpResponse源码
2 request方法初识
'''
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及?号后面的参数)
...
)
'''
3 form表单上传文件
必须要指定的参数 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')
4 Jsonresponse
JsonRespanse:( return JsonRespanse(dict)(默认只能传字典,需要传其他类型需要将safe参数改为False) )
5 FBV与CBVFBV 基于函数的视图
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上加装饰器
6 CBV源码
# 切入点 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,...)
愿君前程似锦,归来仍是少年