博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数
阅读量:7051 次
发布时间:2019-06-28

本文共 3093 字,大约阅读时间需要 10 分钟。

一、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})

  

 

 

 

  

 

 

  

  

转载于:https://www.cnblogs.com/jishuweiwang/p/6362859.html

你可能感兴趣的文章
java中堆(heap)和堆栈(stack)
查看>>
H3C 5500/5820 端口聚合LACP
查看>>
我的友情链接
查看>>
Forefront TMG 服务器中如何规划和实现高可用性
查看>>
Exchange Server 2010 故障分享
查看>>
java正则匹配count字符串
查看>>
Exchange2007/2010如何恢复被禁用或者删除的邮箱
查看>>
第五天:Before -- CMD
查看>>
Docker软件安装系列。
查看>>
我的友情链接
查看>>
LEFT JOIN连表时,ON后多条件无效问题
查看>>
[20180423]flashback tablespace与snapshot standby.txt
查看>>
php中禁止单个ip与ip段访问的代码小结
查看>>
LeetCode-330.Patching Array
查看>>
zxing生成二维码转base64 img直接显示 Image对象转Base64码(java)
查看>>
xfire冲突问题解决(maven配置)
查看>>
C#面向对象(三)接口实现多态
查看>>
Linux下用Java获取本机IP
查看>>
Eclipse的Spring库导入
查看>>
velocity 判断 变量 是否不是空或empty
查看>>