一、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. Java 本地环境设置

    如果你希望在你的本地环境中设置 Java 程序环境,下面的这部分将会指导你在你的本地计算机上下载和设置 Java 环境.你可以按照下面的步骤进行. Java SE 目前是免费下载的,你可以通过单击下面 ...

  2. @Component、@Service、@Constroller

    @Component.@Service.@Constroller,@Repository,它们分别用于软件系统的不同层次: @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可 ...

  3. Linux文件与目录管理(三)

    一.Linux文件内容查看 1.cat:由第一行开始显示文件内容 2.tac:从最后一行开始显示,可以看出tac是cat倒着写 3.nl:显示的时候,顺便输出行号 4.more:一页一页的显示文件内容 ...

  4. h5请求跨域问题Access-Control-Allow-Origin解决跨域

    访问后端接口报错:No 'Access-Control-Allow-Origin' header is present on the requested resource 解决: Access-Con ...

  5. iOS UI-Lable标签、NStimer定时器和RunLoop超级死循环

    // 标签UILable -显示文字 // 1.创建标签 UILabel *lable = [[UILabel alloc] init]; // 2.设置标签的坐标和大小 [lable setFram ...

  6. ORACLE11G内存管理参数

    今天,对ORACLE11G的几个内存参数看了一下,记录如下,大家可以参考: 1.首先,在ORACLE11G的INIT.ORA里,有“__”开头的参数,也就是以两个下划线开头的参数,这种参数应该是系统自 ...

  7. Executors类的newFixedThreadPool, newCachedThreadPool, newScheduledThreadPool

    Executors 类对 ThreadPoolExecutor 的构造函数进行了封装,使用该类可方便地创建线程池. 1. newFixedThreadPool public static Execut ...

  8. ActiveMQ (一):安装启动及测试

    1. 预备知识 1.1 JMS JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范.<百科> 1.2 JMX JMX(Java M ...

  9. SQL基础日期函数

    --dateadd 将制定的数值添加到指定的日期部分后的日期 select dateadd(mm,4,'01/01/99') -- 返回:以当前的日期格式返回05/01/99 --datediff 二 ...

  10. 桥接、nat、host-only