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 相关文章推荐
python线程、进程和协程详解
Jul 19 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
你眼中的Python大牛 应该都有这份书单
Oct 31 Python
快速入门python学习笔记
Dec 06 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
Django stark组件使用及原理详解
Aug 22 Python
Python垃圾回收机制三种实现方法
Apr 27 Python
Python如何向SQLServer存储二进制图片
Jun 08 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
adodb与adodb_lite之比较
2006/12/31 PHP
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
php 浮点数比较方法详解
2017/05/05 PHP
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
vue使用自定义icon图标的方法
2018/05/14 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
实现python版本的按任意键继续/退出
2016/09/26 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
python数据挖掘需要学的内容
2019/06/23 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
青年文明号复核材料
2014/02/11 职场文书
留学经费担保书
2014/05/12 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
python Polars库的使用简介
2021/04/21 Python
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android
配置nginx负载均衡
2022/05/06 Servers