Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数

1、FBV和CBVhtml

  在Python菜鸟之路:Django 路由、模板、Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法能够称之为FBV: function base view 。python

  今天补充另一种路由关系的写法:CBV,即:class base view , 也能够看作为面向资源编程的另一种叫法,相似tornado中的路由写法。django

1. 创建路由关系urls.py编程

from app01 import views

urlpatterns = [
    url(r'^home/', views.Home.as_views()),
]

2. 书写处理逻辑views.pyapp

from django.views import View
class 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')

2、url中的默认参数urls.py函数

urlpatterns = [
    url(r'^index/', views.index, name='root'),
]

或者

urlpatterns = [
    url(r'^index/', views.index, {'name':'root',}),
]

  对应地,在views.py中,函数也须要有一个参数来接收默认参数tornado

def index(request,name):
    print(name)
    return HttpResponse('OK')

3、FBV和CBV的用户验证装饰器post

  FBV简单,就是一般所用到的函数的装饰器。而CBV的用户验证,能够用上面提到的dispatch方法,也能够用另一种方法,请往下看url

# 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

@auth
def index(reqeust):
    # 获取当前已经登陆的用户
    v = reqeust.COOKIES.get('username111')
    return render(reqeust,'index.html',{'current_user': v})

------------------spa

from django import views
from django.utils.decorators import method_decorator

class 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 views

class 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 views
from 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})
相关文章
相关标签/搜索