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 相关文章推荐
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
详解python解压压缩包的五种方法
Jul 05 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
Python Web程序搭建简单的Web服务器
Jul 31 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
PyTorch中的C++扩展实现
Apr 02 Python
pytorch快速搭建神经网络_Sequential操作
Jun 17 Python
CentOS 7如何实现定时执行python脚本
Jun 24 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 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
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
php中关于换行的实例写法
2019/09/26 PHP
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
JavaScript操作 url 中 search 部分方法函数
2016/06/15 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
python中类的一些方法分析
2014/09/25 Python
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
python实现网站的模拟登录
2016/01/04 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
美国高档帽子网上商店:Hats.com
2018/08/09 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
小学班主任寄语大全
2014/04/04 职场文书
党建目标管理责任书
2014/07/25 职场文书
颐和园导游词400字
2015/01/30 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书