1.CBV 和 FBV
FBV function based view CBV class based view
2. CBV的使用流程
在 view中 导入 from django.views import View
1.创建一个类 继承父类 View
class Cbv(View):
def get(self,request):
return HttpResponse('Ok!!!')
def post(self,request)
pass
自动判断请求方法 而执行相对应函数
2. 在路由 url文件中
url(r'^add_press/$', views.Cbv.as_view())
3.执行原理 views.Cbv.as_view()
三个方法 :as_vieiw---->view---->dispatch-----存在 / 不存在 (请求方法) ----返回响应
1.在 as_vieiw() 中执行 view 方法 return self.dispatch() -->执行dispatch
dispatch():中 通过 getattr 反射 拿到 子类的 get 或post 方法 给到handler 再返回执行
1.判断请求方法 是否存在于 http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
2. 如果存在 就执行子类 中对应的方法(get,post.......)
3.handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
此时handler 就是一个 方法 return handler (request ,*arg,**kwgs) 加括号执行
2.返回handler 相当于是一个HttpResponse 对象 返回到django 处理 httpresponse 响应
3.如果请求方法 不存在,则django内置方法 返回一个 不存在的 HttpResponse 页面
6. 加装饰器
FBV 普通加法
@wrapper
def test()
CBV
from django.utils.decorators import method_decorator 使用django 封装的方法 使用装饰器
1. 加在方法上
@method_decorator(timer)
def get(self, request):
2. 加在dispatch上 在CBV中只有加载dispatch 上才有用
@method_decorator(timer)
def dispatch(self, request, *args, **kwargs)
3. 加在类上
@method_decorator(timer,name='post')
@method_decorator(timer,name='get')
class AddPress(View):
7. request 和response
1.request .GET('name') 获取url中的参数 2.request.POST('name') 获取 form提交的 或ajax 提交的data数据
3. request. file 获取上传文件 4.request.body数据真正存放的地方
5.request.get_host 6.request.is_ajax
HttpResponse render redirect