一、FBV和CBV

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

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

1. 建立路由关系urls.py

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

2. 书写处理逻辑views.py

  1. from django.views import View
  2. class Home(View): # 这里需要注意,必须继承View类
  3. # dispatch可以不写,仅仅作为了解,明白在所有类中,优先会执行dispatch方法,便于扩展
  4. def dispatch(self, request, *args, **kwargs):
  5. # 调用父类中的dispatch
  6. print('before') # 类似装饰器的功能
  7. result = super(Home,self).dispatch(request, *args, **kwargs)
  8. print('after') # 类似装饰器的功能
  9. return result
  10.  
  11. def get(self,request):
  12. print(request.method)
  13. return render(request, 'home.html')
  14.  
  15. def post(self,request):
  16. print(request.method,'POST')
  17. return render(request, 'home.html')

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

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

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

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

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

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

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

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

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

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

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

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

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

  

  

  

  

Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数的更多相关文章

  1. Python菜鸟之路:Django 路由、模板、Model(ORM)

    Django路由系统 Django的路由系统让Django可以根据URI进行匹配,进而发送至特定的函数去处理用户请求.有点类似nginx的location功能. Django的路由关系分为三种:普通关 ...

  2. Python菜鸟之路:Python基础(二)

    一.温故而知新 1. 变量命名方式 旧的方式: username = 'xxxx' password = 'oooo' 新的方式: username, password = 'xxxx', 'oooo ...

  3. Python菜鸟之路:Python基础-类(2)——成员、成员修饰符、异常及其他

    三大成员 在Python的面向对象中,主要包括三大成员:字段.方法.属性 字段 类成员的字段又可分为普通字段.静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,代码示例如下: ...

  4. Python菜鸟之路:Python基础——函数

    一.函数 1. 简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2. 组成 函数代码块以 def 关键词开头,后接函数名和圆括号( ...

  5. Python菜鸟之路:Python基础(三)

    一.编码 推荐阅读<字符编码的前世今生>:http://tgideas.qq.com/webplat/info/news_version3/804/808/811/m579/201307/ ...

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

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

  7. django之路由分组,路由分发,FBV,CBV,ORM框架

    今日的内容: a. 路由系统 1. 创建app 2. 路由的分组 3. 路由的分发 - 正则表达式匹配 b. django的orm(模型model) 1. 创建模型的步骤 2. orm基本的增删改查 ...

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

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

  9. Django生命周期,FBV,CBV

    一. Django生命周期 首先我们知道HTTP请求及服务端响应中传输的所有数据都是字符串,在Django中,当我们访问一个的url时,会通过路由匹配进入相应的html网页中.Django的请求生命周 ...

随机推荐

  1. gdi软光栅化注意事项

    1,opengl viewport原点在左下角,而gdi画图api原点在左上角,所以在实现了整个opengl管线,最后将点通过gdi函数画到屏幕时要进行临时转化. 2,注意gdi画点的api传入的颜色 ...

  2. Memcached管理与监控

    一个用PHP编写的可视化的MemCached管理系统 MemAdmin是一款可视化的Memcached管理与监控工具,使用PHP开发,体积小,操作简单. 主要功能: 服务器参数监控:STATS.SET ...

  3. maven分开打包jar文件和依赖jar包和资源文件

    <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...

  4. 【转载】Oracle之内存结构(SGA、PGA)

    [转自]http://blog.itpub.net/25264937/viewspace-694917/ 一.内存结构 SGA(System Global Area):由所有服务进程和后台进程共享: ...

  5. G1日志分析

    1. 概述 来自对官方G1垃圾收集器的日志解释分析,官方地址:https://blogs.oracle.com/poonam/understanding-g1-gc-logs或https://blog ...

  6. Secure Spring REST API using Basic Authentication

    What is Basic Authentication? Traditional authentication approaches like login pages or session iden ...

  7. SVN提交项目时版本冲突解决方案

    版本冲突原因: 假设A.B两个用户都在版本号为7的时候,更新了index.jsp这个文件,A用户在修改完成之后提交index.jsp到服务器,这个时候提交成功,这个时候index.jsp文件的版本号已 ...

  8. hibernate 在web.xml中配置的作用

    1. <filter>     <filter-name>Spring character encoding filter</filter-name>     &l ...

  9. jQuery 实战读书笔记之第四章:使用特性、属性和数据

    使用属性 /* 每个元素都有一或多个特性,,这些特性的用途是给出相应元素或其内容的附加信息.(出自 JavaScript 高级程序设计) */ /* 特性是固有的 JavaScript 对象 属性指的 ...

  10. Transporting Data Between Database

    The Export utility can provide a logical backup of: Database objects A tablespace An entire database ...