一、FBV和CBV

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

  今天补充另外一种路由关系的写法:CBV,即:class base view , 也可以看做为面向资源编程的另外一种叫法,类似tornado中的路由写法。

1. 建立路由关系urls.py

1
2
3
4
5
from app01 import views
 
urlpatterns = [
    url(r'^home/', views.Home.as_views()),
]

2. 书写处理逻辑views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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')

二、url中的默认参数urls.py

1
2
3
4
5
6
7
8
9
urlpatterns = [
    url(r'^index/', views.index, name='root'),
]
 
或者
 
urlpatterns = [
    url(r'^index/', views.index, {'name':'root',}),
]

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

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

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

  FBV简单,就是通常所用到的函数的装饰器。而CBV的用户验证,可以用上面提到的dispatch方法,也可以用另外一种方法,请往下看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# FBV的用户验证装饰器
def auth(func):
    def inner(reqeust,*args,**kwargs):
        = reqeust.COOKIES.get('username111')
        if not v:
            return redirect('/login/')
        return func(reqeust, *args,**kwargs)
    return inner
 
@auth
def index(reqeust):
    # 获取当前已经登录的用户
    = reqeust.COOKIES.get('username111')
    return render(reqeust,'index.html',{'current_user': v})

------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
from django import views
from django.utils.decorators import method_decorator
 
class Order(views.View):
    @method_decorator(auth)
    def get(self,reqeust):
        = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})
 
 
    def post(self,reqeust):
        = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

  从上边可以发现一个特别,如果想对POST方法也进行认证,就需要在post函数上再加装饰器,如果有六七种方法,那么无疑需要六七种装饰器,是很麻烦的, 因此可以利用dispatch方法来进行验证,利用了所有的class都会执行dispatch方法的特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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):
        = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})
 
    def post(self,reqeust):
        = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

  某些人可能在想了,这样还得写一个dispatch函数,而实际上dispatch函数内容什么也都没变,那么有没有更加简便的方法,最终版看如下:

1
2
3
4
5
6
7
8
9
10
11
12
from django import views
from django.utils.decorators import method_decorator
 
@method_decorator(auth,name='dispatch')
class Order(views.View):
    def get(self,reqeust):
        = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})
 
    def post(self,reqeust):
        = reqeust.COOKIES.get('username111')
        return render(reqeust,'index.html',{'current_user': v})

  

Django FBV和CBV -的更多相关文章

  1. django——FBV与CBV

    引言 FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV CBV(class bas ...

  2. Python - Django - FBV 和 CBV

    FBV: Function Base View,基于函数的视图 views.py: from django.shortcuts import render, HttpResponse # FBV de ...

  3. django请求生命周期,FBV和CBV,ORM拾遗,Git

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...

  4. Django之FBV与CBV

    一.FBV与CBV FBV(function based views),即基于函数的视图:CBV(class based views),即基于类的视图,也是基于对象的视图.当看到这个解释时,我是很萌的 ...

  5. python 全栈开发,Day84(django请求生命周期,FBV和CBV,ORM拾遗,Git)

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...

  6. django基础 -- 4. 模板语言 过滤器 模板继承 FBV 和CBV 装饰器 组件

    一.语法 两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二.变量 1. 可直接用  {{ 变量名 }} (可调用字符串, 数字 ,列表,字典,对象等) ...

  7. django中的FBV和CBV

    django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...

  8. django中视图处理请求方式(FBV、CBV)

    FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV CBV(class base v ...

  9. Django FBV/CBV、中间件、GIT使用

    s5day82 内容回顾: 1. Http请求本质 Django程序:socket服务端 a. 服务端监听IP和端口 c. 接受请求 \r\n\r\n:请求头和请求体 \r\n & reque ...

随机推荐

  1. 多线程(JDK1.5的新特性互斥锁)

    多线程(JDK1.5的新特性互斥锁)(掌握)1.同步·使用ReentrantLock类的lock()和unlock()方法进行同步2.通信·使用ReentrantLock类的newCondition( ...

  2. 20170728xlVba SSC_LastTwoDays

    Public Sub SSCLastTwoDays() Dim strText As String Dim Reg As Object, Mh As Object, OneMh As Object D ...

  3. 库: rspec/rspec-expectations matcher匹配器常用

    https://github.com/rspec/rspec-expectations https://relishapp.com/rspec/rspec-expectations/v/3-7/doc ...

  4. Confluence 6 使用 LDAP 授权连接一个内部目录 - 拷贝用户到登录

    在登录时拷贝用户(Copy User on Login) 这个选项在用户尝试登录的时候将会被触发.如果这个选择框被选择的话,当用户使用 LDAP 授权的用户名和密码登录系统的时候,用户将会在内部目录自 ...

  5. 带分数(dfs,next_permutation)

    问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...

  6. java keytool详解

    Keytool 是一个Java 数据证书的管理工具 ,Keytool 将密钥(key)和证书(certificates)存在一个称为keystore的文件中. 在keystore里,包含两种数据:(1 ...

  7. 深入理解$watch ,$apply 和 $digest --- 理解数据绑定过程——续

    Angular什么时候不会自动为我们$apply呢? 这是Angular新手共同的痛处.为什么我的jQuery不会更新我绑定的东西呢?因为jQuery没有调用$apply,事件没有进入angular ...

  8. ES bulk源码分析——ES 5.0

    对bulk request的处理流程: 1.遍历所有的request,对其做一些加工,主要包括:获取routing(如果mapping里有的话).指定的timestamp(如果没有带timestamp ...

  9. ES6扩展运算符的几个小技巧

    es6扩展运算符,也就是...  ,作用是将一个数组转为用逗号分隔的参数序列. 那么问题来了,我们为啥要用这么奇怪的东东涅,当然因为它能大大提高我们的开发效率.所以,可别小看这三个点. 1.复制数组( ...

  10. sql存储过程中,如何根据指定日期、月数、天数推算预产日期

    我这边有一个业务,根据某个指定日期,推算某个患者的预产日期 原理:比如孕产的预产日期的算法(预产日期 = 末次月经日期+ 10月+8天) 那么我们怎么通过存储过程来实现呢? 首先分析条件 需要一个指定 ...