AI-CBV写法

CBV固定样式

  1. #url.py
  2.  
  3. from django.conf.urls import url
  4. from django.contrib import admin
  5. from app01 import views
  6. urlpatterns = [
  7. url(r'^admin/', admin.site.urls),
  8. url(r'^login/', views.Loginview.as_view()), #CBV格式,Loginview是类名
  9. ]
  1. # views.py
  2.  
  3. from django.shortcuts import render,HttpResponse
  4. from django.views import View
  5. # Create your views here.
  6. class Loginview(View): #里边可以封装很多方法
  7. def get(self,request):
  8. return render(request,"login.html",locals())
  9.  
  10. def post(self,request):
  11. return HttpResponse("post")
  1. #login.html
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
  8. </head>
  9. <body>
  10. <form action="" method="post">
  11. {% csrf_token %}
  12. 用户名:<input type="text" name="user">
  13. 密码:<input type="password" name="pwd">
  14. <button type="submit">提交</button>
  15. </form>
  16. </body>
  17. </html>

CBV源码解析

  1. #1.从url开始执行
  2. urlpatterns = [
  3. url(r'^admin/', admin.site.urls),
  4. url(r'^login/', Views.Loginview.as_view()), #CBV格式,Loginview是类名
  5. ]
  6.  
  7. #2.url(r'^login/', views.Loginview.as_view()) 代表在Loginview继承的View类中找as_view方法
  8.  
  9. def as_view(cls, **initkwargs):
  10. def view(request, *args, **kwargs):
  11. self = cls(**initkwargs)
  12. if hasattr(self, 'get') and not hasattr(self, 'head'): # self,即Login_View对象
  13. self.head = self.get
  14. self.request = request
  15. self.args = args
  16. self.kwargs = kwargs
  17. return self.dispatch(request, *args, **kwargs)
  18. return view
  19. # 3.调用as_view方法时,返回了view,相当于
  20. url(r'^login/', Views.view)
  21. # 4.一旦用户get访问login,相当于给view传参view(request)
  22. def view(request, *args, **kwargs):
  23. self = cls(**initkwargs) #5.cls为当前类的实例化对象,即LoginView的实例化对象
  24. if hasattr(self, 'get') and not hasattr(self, 'head'): # self,即Login_View对象
  25. self.head = self.get
  26. self.request = request
  27. self.args = args
  28. self.kwargs = kwargs
  29. return self.dispatch(request, *args, **kwargs) #6.表示从LoginView的实例化对象中找dispatch方法
  30.  
  31. # 7.找不到dispatch方法,就在View中找
  32. class Loginview(View): #里边可以封装很多方法
  33. def get(self,request):
  34. return render(request,"login.html",locals())
  35.  
  36. # 8. 找到dispatch方法,
  37. class View(object):
  38.  
  39. http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
  40.  
  41. def dispatch(self, request, *args, **kwargs):
  42. if request.method.lower() in self.http_method_names:
  43. # handler表示get、post等
  44. handler = getattr(self, request.method.lower(), self.http_method_not_allowed) #8.self不在request.method.lower()中,
  45. # 就使用self.http_method_not_allowed进行报错处理
  46. else:
  47. handler = self.http_method_not_allowed
  48. return handler(request, *args, **kwargs) #9.执行handler(get()、post()等方法)
  49.  
  50. # 10.执行get等方法,返回前端页面,完毕
  51. class Loginview(View): #里边可以封装很多方法
  52. def get(self,request):
  53. return render(request,"login.html",locals())

CBV重写dispatch

  1. # views.py
  2.  
  3. from django.shortcuts import render,HttpResponse
  4. from django.views import View
  5. # Create your views here.
  6. class Loginview(View): #里边可以封装很多方法
  7. def dispatch(self, request, *args, **kwargs):
  8. print("可以将公共的功能放到此处")
  9. #其实这样写,和没有写dispatch方法功能一样,"多此一举"?不是,有用处滴!
  10. # 每次执行代码都会走这个dispatch方法,可以将公共的功能放到此处
  11. ret=super().dispatch(request,*args,**kwargs) #覆盖源码dispatch功能
  12.      return ret
  13. def get(self,request):
  14. return render(request,"login.html",locals())
  15.  
  16. def post(self,request):
  17. return HttpResponse("post")

AI-CBV写法的更多相关文章

  1. flask 第三章 特殊装饰器 CBV Flask-Session WTForms

    1.flask中的特殊装饰器 前面我们讲过的装饰器函数中,用来登录验证,这次我们来介绍几个flask中的特殊装饰器 1). @app.before_request 具体的用途是: 在请求进入视图函数之 ...

  2. django(六):view和cbv

    FBV即以函数的形式实现视图函数,CBV即以类的形式实现视图函数:相比而言,CBV根据请求方式书写各自的代码逻辑,结构清晰明了,但是由于多了一层反射机制,性能要差一些:FBV执行效率要高一些,但是代码 ...

  3. django基础之FBV与CBV,ajax序列化补充,Form表单

    目录: FBV与CBV ajax序列化补充 Form表单(一) 一.FBV与CBV 1.什么是FBV.CBV? django书写view时,支持两种格式写法,FBV(function bases vi ...

  4. Django中CBV View的as_view()源码解析

    CBV与FBV路由区别 urlpatterns = [ url(r'^publish/$', views.Publishs.as_view()), # CBV写法 url(r'^publish/$', ...

  5. Django(二)路由系统、视图、模板

    大纲 一.内容概要: 二.上节回顾 三.Django 视图–views  1.获取用户多个数据及文件上传  2.FBV 和 CBV  3.装饰器 四.Django模板补充  - Django模板语言循 ...

  6. Flask 视图,中间件

    视图 FBV def index(nid): """ 请求相关信息 request.method # 请求方式 request.args # get 方式的参数获取 re ...

  7. Django知识总结(一)

    壹 ● 有关http协议 一 ● 全称 超文本传输协议(HyperText Transfer Protocol) 二 ● 协议 双方遵循的规范 http协议是属于应用层的协议(还有ftp, smtp等 ...

  8. Django-rest-framework 接口实现 Serializer 使用

    Django接口实现 DRF 使用 以下模块 实现 json数据 序列化 博客: https://www.cnblogs.com/liwenzhou/p/9959979.html Django RES ...

  9. Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(3)

    1.drf前期准备 1.django-rest-framework官方文档 https://www.django-rest-framework.org/ #直接百度找到的djangorestframe ...

  10. Flask 框架

    装饰器知识回顾 http://www.cnblogs.com/0bug/p/7978595.html 普通装饰器格式: def wrapper(func): def inner(*args, **kw ...

随机推荐

  1. Tip: JSP开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. JSP+JavaBean模式适合开发业务 ...

  2. 第六天-request response\04-response实现文件下载.avi--本人测试失败

    package cn.itcast.response; import java.io.FileInputStream;import java.io.IOException;import java.io ...

  3. 黑马程序员_Java基础视频-深入浅出精华版--视频列表

    \day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...

  4. Spark架构与作业执行流程简介

    https://www.cnblogs.com/shenh062326/p/3658543.html

  5. android动态设置组件LayoutParams

    开发中经常用到动态设置组件的LayoutParams,之前开发遇到的问题如下: LinearLayout.LayoutParams params = new LinearLayout.LayoutPa ...

  6. webstorm的快捷键总结

    ctrl+shift+f 可以在项目和模块中的文件中查找特定字符串 shift键连续敲一下,可以在项目和模块中查找特定的文件 ctrl+d  复制当前行并粘贴到下一行 ctrl+shift+上下方向键 ...

  7. Linux下的Jenkins+Tomcat+Maven+Git+Shell环境的搭建使用(jenkins自动化部署)【转】

    jenkins自动化部署 目标:jenkins上点构建(也可以自动检查代码变化自动构建)>>>项目部署完成. 一.安装jenkins 1.下载jenkins 这里我选择的是war包安 ...

  8. wtforms-表单生成及验证

    介绍 wtforms是一个支持多个web框架的form组件,主要用来做表单的验证以及生成的, 安装 pip install wtforms 使用 自定义一个类,继承wtforms.Form类,定义字段 ...

  9. ubuntu16.04彻底删除nginx+php

    1.1 删除nginx,–purge包括配置文件 sudo apt-get --purge remove nginx 1.2 自动移除全部不使用的软件包 sudo apt-get autoremove ...

  10. struts2框架之国际化(参考第二天学习笔记)

    国际化 1. 回忆之前的国际化 1). 资源包(key=字符串) > 命名:基本名称+local部分.properties,res_zh.properties,res_zh_CN.propert ...