一、FBV和CBV
在一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view 。
今天补充另外一种路由关系的写法:CBV,即:class base view , 也可以看做为面向资源编程的另外一种叫法,类似tornado中的路由写法。
1. 建立路由关系urls.py
from app01 import viewsurlpatterns = [ url(r'^home/', views.Home.as_views()),]
2. 书写处理逻辑views.py
from django.views import Viewclass Home(View): # 这里需要注意,必须继承View类 # dispatch可以不写,仅仅作为了解,明白在所有类中,优先会执行dispatch方法,便于扩展 def dispatch(self, request, *args, **kwargs): # 调用父类中的dispatch print('before') # 类似装饰器的功能 result = super(Home,self).dispatch(request, *args, **kwargs) print('after') # 类似装饰器的功能 return result def get(self,request): print(request.method) return render(request, 'home.html') def post(self,request): print(request.method,'POST') return render(request, 'home.html')
二、url中的默认参数urls.py
urlpatterns = [ url(r'^index/', views.index, name='root'),]或者urlpatterns = [ url(r'^index/', views.index, {'name':'root',}),]
对应地,在views.py中,函数也需要有一个参数来接收默认参数
def index(request,name): print(name) return HttpResponse('OK')
三、FBV和CBV的用户验证装饰器
FBV简单,就是通常所用到的函数的装饰器。而CBV的用户验证,可以用上面提到的dispatch方法,也可以用另外一种方法,请往下看
# FBV的用户验证装饰器def auth(func): def inner(reqeust,*args,**kwargs): v = reqeust.COOKIES.get('username111') if not v: return redirect('/login/') return func(reqeust, *args,**kwargs) return inner@authdef index(reqeust): # 获取当前已经登录的用户 v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v})
------------------
from django import viewsfrom django.utils.decorators import method_decoratorclass Order(views.View): @method_decorator(auth) def get(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v}) def post(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v})
从上边可以发现一个特别,如果想对POST方法也进行认证,就需要在post函数上再加装饰器,如果有六七种方法,那么无疑需要六七种装饰器,是很麻烦的, 因此可以利用dispatch方法来进行验证,利用了所有的class都会执行dispatch方法的特性
from django import viewsclass Order(views.View): @method_decorator(auth) def dispatch(self, request, *args, **kwargs): return super(Order,self).dispatch(request, *args, **kwargs) def get(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v}) def post(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v})
某些人可能在想了,这样还得写一个dispatch函数,而实际上dispatch函数内容什么也都没变,那么有没有更加简便的方法,最终版看如下:
from django import viewsfrom django.utils.decorators import method_decorator@method_decorator(auth,name='dispatch')class Order(views.View): def get(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v}) def post(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v})