一 、定义:
FBV(function base views) 就是在视图里使用函数处理请求。之前都是FBV模式写的代码,所以就不写例子了。
CBV(class base views) 就是在视图里使用类处理请求。
CBV优点:
- 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
- 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
二、使用步骤:
views中:
1、导入:from django.views import view
2、创建新类(继承View类):class LoginView(View):
3、重写dispatch方法:def dispatch (self,request,*args,**kwargs):
4、其中需执行父类的dispactch:ret=super().dispatch(request,*args,**kwargs)
5、最后需返回ret值(get或post的值):return ret (send到浏览器)
urls中:
url(r'^login/', views.LoginView.as_view())
源码:1.as_view()--view 2用户请求到了 view 3view里面执行了dispatch,反射找到请求方法对应的自己视图的方法。
三、装饰器
FBV:
#装饰器 def xxx(func1): def inner(request,*args,**kwargs): print('xx1') ret = func1(request,*args,**kwargs) print('xx2') return ret return inner @xxx def index(request):pass
CBV:
方式一:
@method_decorator(xxx)
def dispatch(...):.... 放在dispatch上面,相当于装饰了get和post方法。
方式二:
@method_decorator(xxx)
def get(self,request):pass
def post(self,request):pass 只加在get上面,相当于只装饰了get方法。
方式三:
@method_decorator(xxx,name='get')
class IndexView(View): 放在整个类的上面,须有name指示装饰谁,不可连写,装饰几个写几行。
四、request对象
request.body:#得到用户提交数据的原始数据类型 b'username=chao&passowrd=123' request.GET request.POST request.method# 获取请求方法。请求中使用的HTTP方法字符串表示,全大写表示 request.path_info #获取用户请求路径,返回用户当前访问的url,不包括域名,不包括参数 request.get_full_path() #获取除域名之外的全路径,包括请求参数 request.META # 获取请求头的元信息
五、response对象
HttpResponse('xxx') #返回一个字符串(封装了 响应头+专程byte类型) render(request,'index.html',{'name':'chao'}) #相应的html文件中: index.html {{ name }}--chao redirect('/login/')# -- 给浏览器发送了一个重定向的请求,浏览器拿到你要重定向的url,然后自动发送了一个ip+端口+路径/login/,的一个请求,后端在配置对应url('^login/',views.login)