一、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. Style样式的四种使用(包括用C#代码动态加载资源文件并设置样式)

    Posted on 2012-03-23 11:21 祥叔 阅读(2886) 评论(6) 编辑 收藏 在Web开发中,我们通过CSS来控制页面元素的样式,一般常用三种方式: 1.       内联样式 ...

  2. English trip V1 - 3.What Would you Like? Teacher:Lamb Key: would like to

    In this lesson you will learn to talk about fast food and health. would = will 的过去式 STARTER 1.Tell y ...

  3. English trip -- VC(情景课)2 D Reading

    Xu言: 业精于勤,荒于嬉:行成于思,毁于随 Before you read 阅读准备 Talk about the picture, what do you see?看图说话,你看到了什么? Lis ...

  4. codeforces 55d//Beautiful numbers// Codeforces Beta Round #51

    题意:一个数能整除它所有的位上的数字(除了0),统计这样数的个数. 注意离散化,为了速度更快需存入数组查找. 不要每次memset,记录下已有的长度下符合条件的个数. 数位dp肯定是从高位到低位. 记 ...

  5. 『PyTorch』第三弹重置_Variable对象

    『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...

  6. 『cs231n』作业1选讲_通过代码理解KNN&交叉验证&SVM

    通过K近邻算法探究numpy向量运算提速 茴香豆的“茴”字有... ... 使用三种计算图片距离的方式实现K近邻算法: 1.最为基础的双循环 2.利用numpy的broadca机制实现单循环 3.利用 ...

  7. Oracle11g温习-第七章:redo日志

      2013年4月27日 星期六 10:33 1.redo (重做) log 的功能:        用于数据恢复   2.redo log 特征: [特征]: 1)   记录数据块的变化(DML.D ...

  8. skill prefix neo,non input 1

    1● neo 新的     2● non 不,非,无  

  9. cas Cas20ProxyReceivingTicketValidationFilter

    Cas20ProxyReceivingTicketValidationFilter  继承AbstractTicketValidationFilter,这里有几个模板方法.例如getTicketVal ...

  10. angular封装jquery插件(组件)

    http://www.phloxblog.in/jquery-plugin-angular-js-directive-clean-html-approach/#.VaCWL9yUemJ