AI-CBV写法

CBV固定样式

#url.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.Loginview.as_view()), #CBV格式,Loginview是类名
]
# views.py

from django.shortcuts import render,HttpResponse
from django.views import View
# Create your views here.
class Loginview(View): #里边可以封装很多方法
def get(self,request):
return render(request,"login.html",locals()) def post(self,request):
return HttpResponse("post")
#login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<form action="" method="post">
{% csrf_token %}
用户名:<input type="text" name="user">
密码:<input type="password" name="pwd">
<button type="submit">提交</button>
</form>
</body>
</html>

CBV源码解析

#1.从url开始执行
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', Views.Loginview.as_view()), #CBV格式,Loginview是类名
] #2.url(r'^login/', views.Loginview.as_view()) 代表在Loginview继承的View类中找as_view方法 def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'): # self,即Login_View对象
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
return view
# 3.调用as_view方法时,返回了view,相当于
url(r'^login/', Views.view) # 4.一旦用户get访问login,相当于给view传参view(request)
def view(request, *args, **kwargs):
self = cls(**initkwargs) #5.cls为当前类的实例化对象,即LoginView的实例化对象
if hasattr(self, 'get') and not hasattr(self, 'head'): # self,即Login_View对象
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs) #6.表示从LoginView的实例化对象中找dispatch方法 # 7.找不到dispatch方法,就在View中找
class Loginview(View): #里边可以封装很多方法
def get(self,request):
return render(request,"login.html",locals()) # 8. 找到dispatch方法,
class View(object): http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
# handler表示get、post等
handler = getattr(self, request.method.lower(), self.http_method_not_allowed) #8.self不在request.method.lower()中,
# 就使用self.http_method_not_allowed进行报错处理
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) #9.执行handler(get()、post()等方法) # 10.执行get等方法,返回前端页面,完毕
class Loginview(View): #里边可以封装很多方法
def get(self,request):
return render(request,"login.html",locals())

CBV重写dispatch

# views.py

from django.shortcuts import render,HttpResponse
from django.views import View
# Create your views here.
class Loginview(View): #里边可以封装很多方法
def dispatch(self, request, *args, **kwargs):
print("可以将公共的功能放到此处")
#其实这样写,和没有写dispatch方法功能一样,"多此一举"?不是,有用处滴!
# 每次执行代码都会走这个dispatch方法,可以将公共的功能放到此处
ret=super().dispatch(request,*args,**kwargs) #覆盖源码dispatch功能
     return ret
def get(self,request):
return render(request,"login.html",locals()) def post(self,request):
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. XML解析技术-dom4j

  2. 迅为-i.MX6Q核心板_四核工业级

    飞思卡尔Freescale Cortex A9 四核处理器处理器:CPU Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz 核心板工艺:十层设计,沉金工艺基本参数:内存 ...

  3. LaTeX IEEE模板

    因为课程作业的要求需要完成一篇IEEE格式的论文,所以选择入门LaTeX.但是期间遇到了各种各样莫名其妙的坑.前前后后挣扎了两个多星期终于完成了IEEE模板的设置.下面详细记录一下让我深恶痛绝的心路历 ...

  4. 为了确认是您本人在申请搬家,请在原博客发表一 篇标题为《将博客搬至CSDN》的文章,并将文章地址填写在上方的"搬家通知地址"中

    为了确认是您本人在申请搬家,请在原博客发表一 篇标题为<将博客搬至CSDN>的文章,并将文章地址填写在上方的"搬家通知地址"中

  5. Fragment和FragmentActivity的使用方法

    认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容.模块化这些UI面板以便提供给其他Acitivity使用便利.同时我们显示的Fragment也会受到当前 ...

  6. Bagging, Boosting, Bootstrap

    Bagging 和 Boosting 都属于机器学习中的元算法(meta-algorithms).所谓元算法,简单来讲,就是将几个较弱的机器学习算法综合起来,构成一个更强的机器学习模型.这种「三个臭皮 ...

  7. while(cin>>n1>>n2)

    这里有2个点, 1. while(cin>>n)用到了强制类型转换 2. 强调输入遇到-1则退出,说明要一直看是否输入了-1,并记录下来 #include <iostream> ...

  8. hibernate框架学习第一天:hibernate介绍及基本操作

    框架辅助开发者进行开发,半成品软件,开发者与框架进行合作开发 Hibernate3Hibernate是一种基于Java的轻量级的ORM框架 基于Java:底层实现是Java语言,可以脱离WEB,在纯J ...

  9. Loj 【CQOI 2006】简单题,mmp

    #10117. 「一本通 4.1 练习 2」简单题     题目描述 题目来源:CQOI 2006 有一个 nnn 个元素的数组,每个元素初始均为 000.有 mmm 条指令,要么让其中一段连续序列数 ...

  10. socket 通信 error:88

    调用函数(setsockopt)来设置 recv buffer 和send  buffer时报错: setsockopt error: Socket operation on non-socket(e ...