Django中的FBV和CBV用法详解


Posted in Python onSeptember 15, 2019

FBV

FBV,即 func base views,函数视图,在视图里使用函数处理请求。

以用户注册代码为例,

使用两个函数完成注册

初级注册代码

def register(request):
 """返回注册页面"""
 return render(request, "register.html")
def register_handle(request):
 """进行注册处理"""
 # 接收数据
 username = request.POST.get("user_name")
 password = request.POST.get("pwd")
 email = request.POST.get("email")
 allow = request.POST.get("allow")
 # 进行数据校验,all方法可以进行迭代,如果有内容为空的,返回false
 if not all([username, password, email]):
 # 数据不完整
 return render(request, "register.html", {"errormsg": "数据不完整"})
 # 邮箱校验
 if not re.match(r'[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
 # 邮箱不合法
 return render(request, "register.html", {"errormsg": "邮箱格式不正确"})
 # 协议是否同意校验
 if allow != "on":
 # 用户不同意协议
 return render(request, "register.html", {"errormsg": "请同意协议"})
 # 校验用户名是否重复
 try:
 user = models.User.objects.get(username=username)
 except models.User.DoesNotExist:
 # 用户名不存在
 user = None
 if user:
 return render(request, "register.html", {"errormsg": "用户名已存在"})
 # 进行业务处理:进行用户注册
 # 使用Django默认的认证系统
 user = models.User.objects.create_user(username, email, password)
 # 因为默认注册后用户是激活的,得进行修改
 user.is_active = 0
 user.save()
 # 返回应答,跳转到首页
 return redirect(reverse("goods:index"))

配套url

urlpatterns = [
 url(r'^register/$', views.register, name="register"), # 注册
 url(r'^register_handle/$', views.register_handle, name="register_handle"), # 注册处理
]

这样虽然分工比较明确,但却比较麻烦,要使用到两个url和两个处理函数,众所周知,程序员是比较懒的,所以FBV的正确打开方式如下

使用一个函数完成注册

FBV注册代码

def register(request):
 """注册"""
 if request.method == 'GET':
 return render(request, "register.html")
 # 接收数据
 username = request.POST.get("user_name")
 password = request.POST.get("pwd")
 email = request.POST.get("email")
 allow = request.POST.get("allow")
 # 进行数据校验,all方法可以进行迭代,如果有内容为空的,返回false
 if not all([username, password, email]):
 # 数据不完整
 return render(request, "register.html", {"errormsg": "数据不完整"})

 # 邮箱校验
 if not re.match(r'[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
 # 邮箱不合法
 return render(request, "register.html", {"errormsg": "邮箱格式不正确"})

 # 协议是否同意校验
 if allow != "on":
 # 用户不同意协议
 return render(request, "register.html", {"errormsg": "请同意协议"})
 # 校验用户名是否重复
 try:
 user = models.User.objects.get(username=username)
 except models.User.DoesNotExist:
 # 用户名不存在
 user = None
 if user:
 return render(request, "register.html", {"errormsg": "用户名已存在"})
 # 进行业务处理:进行用户注册
 # 使用Django默认的认证系统
 user = models.User.objects.create_user(username, email, password)
 # 因为默认注册后用户是激活的,得进行修改
 user.is_active = 0
 user.save()
 # 返回应答,跳转到首页
 return redirect(reverse("goods:index"))

配套url

urlpatterns = [
 url(r'^register/$', views.register, name="register"), # 注册
]

但此时问题又来了,我们知道,在http中请求的方式有get,post,head,options,put,delete,trace,connect等多种方式,从网上盗了一张图来描述这些请求,原图链接地址为:https://3water.com/article/170023.htm

Django中的FBV和CBV用法详解

而上面的只处理了get和post,虽然我们可以再定义其他的函数和url来处理,或者通过if判断来进行区别对待,但这明显会显得麻烦,此时,我们可以使用CBV来解决这个问题。

CBV

CBV,即 class base views,类视图,在视图里使用类处理请求。

CBV代码可以解决诸多请求方式的问题,具备可读性,同时也更加符合面向对象编程。

使用CBV完成注册

CBV注册代码

from django.shortcuts import render, redirect, HttpResponse
from django.views.generic import View
from django.core.urlresolvers import reverse
from django.core.mail import send_mail
from django.contrib.auth import authenticate, login
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired
import re
from django.conf import settings
import user.models as models
class RegisterView(View):
 """注册视图"""
 def get(self, request):
 """返回注册页面"""
 return render(request, "register.html")
 def post(self, request):
 """进行注册处理"""
 # 接收数据
 username = request.POST.get("user_name")
 password = request.POST.get("pwd")
 email = request.POST.get("email")
 allow = request.POST.get("allow")
 # 进行数据校验,all方法可以进行迭代,如果有内容为空的,返回false
 if not all([username, password, email]):
  # 数据不完整
  return render(request, "register.html", {"errormsg": "数据不完整"})
 # 邮箱校验
 if not re.match(r'[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
  # 邮箱不合法
  return render(request, "register.html", {"errormsg": "邮箱格式不正确"})
 # 协议是否同意校验
 if allow != "on":
  # 用户不同意协议
  return render(request, "register.html", {"errormsg": "请同意协议"})
 # 校验用户名是否重复
 try:
  user = models.User.objects.get(username=username)
 except models.User.DoesNotExist:
  # 用户名不存在
  user = None
 if user:
  return render(request, "register.html", {"errormsg": "用户名已存在"})
 # 进行业务处理:进行用户注册
 # 使用Django默认的认证系统
 user = models.User.objects.create_user(username, email, password)
 # 因为默认注册后用户是激活的,得进行修改
 user.is_active = 0
 user.save()
 # 发送激活邮件,包括激活链接:http://127.0.0.1:8000/user/active/3
 # 激活链接中需要包含用户的身份信息,并且要把身份信息进行加密
 # 加密用户的身份信息,生成激活token
 serializer = Serializer(settings.SECRET_KEY, 1800)
 info = {'confirm': user.id}
 token = serializer.dumps(info)
 token = token.decode()
 # 发邮件
 subject = "绿色果园欢迎信息"
 message = ""
 sender = settings.EMAIL_FROM
 receiver = [email]
 html_message = "<h2>%s, 欢迎你成为绿色果园注册会员</h2></br>请点击以下链接激活账号<a href='http:127.0.0.1:8000/" \
   "user/active/%s'>http:127.0.0.1:8000/user/active/%s</a>" % (username, token, token)
 send_mail(subject, message, sender, receiver, html_message=html_message)
 # 返回应答,跳转到首页
 return redirect(reverse("goods:index"))

配套url

from user.views import RegisterView
urlpatterns = [
 url(r'^register/$', RegisterView.as_view(), name="register"), # 注册
]

总结

以上所述是小编给大家介绍的Django中的FBV和CBV用法详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
python实现txt文件格式转换为arff格式
May 31 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
详解Python中的type和object
Aug 15 Python
python五子棋游戏的设计与实现
Jun 18 Python
12个步骤教你理解Python装饰器
Jul 01 Python
PyCharm搭建Spark开发环境的实现步骤
Sep 05 Python
python3.8下载及安装步骤详解
Jan 15 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 Python
Python+uiautomator2实现自动刷抖音视频功能
Apr 29 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 #Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 #Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 #Python
Python数据库小程序源代码
Sep 15 #Python
python中树与树的表示知识点总结
Sep 14 #Python
python树的同构学习笔记
Sep 14 #Python
python图形绘制奥运五环实例讲解
Sep 14 #Python
You might like
php 判断数组是几维数组
2013/03/20 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
javascript深入理解js闭包
2010/07/03 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
vue实现登录拦截
2020/06/29 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
python中有帮助函数吗
2020/06/19 Python
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
大学应届生求职简历的自我评价
2013/10/08 职场文书
中专生自我鉴定范文
2013/12/19 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
在职证明格式样本
2015/06/15 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
采购部年度工作总结
2015/08/13 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
V Rising 服务器搭建图文教程
2022/06/16 Servers
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技