Django中的FBV和CBV用法詳解
FBV
FBV,即 func base views,函數(shù)視圖,在視圖里使用函數(shù)處理請求。
以用戶注冊代碼為例,
使用兩個(gè)函數(shù)完成注冊
初級注冊代碼
def register(request):
"""返回注冊頁面"""
return render(request, "register.html")
def register_handle(request):
"""進(jìn)行注冊處理"""
# 接收數(shù)據(jù)
username = request.POST.get("user_name")
password = request.POST.get("pwd")
email = request.POST.get("email")
allow = request.POST.get("allow")
# 進(jìn)行數(shù)據(jù)校驗(yàn),all方法可以進(jìn)行迭代,如果有內(nèi)容為空的,返回false
if not all([username, password, email]):
# 數(shù)據(jù)不完整
return render(request, "register.html", {"errormsg": "數(shù)據(jù)不完整"})
# 郵箱校驗(yàn)
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": "郵箱格式不正確"})
# 協(xié)議是否同意校驗(yàn)
if allow != "on":
# 用戶不同意協(xié)議
return render(request, "register.html", {"errormsg": "請同意協(xié)議"})
# 校驗(yàn)用戶名是否重復(fù)
try:
user = models.User.objects.get(username=username)
except models.User.DoesNotExist:
# 用戶名不存在
user = None
if user:
return render(request, "register.html", {"errormsg": "用戶名已存在"})
# 進(jìn)行業(yè)務(wù)處理:進(jìn)行用戶注冊
# 使用Django默認(rèn)的認(rèn)證系統(tǒng)
user = models.User.objects.create_user(username, email, password)
# 因?yàn)槟J(rèn)注冊后用戶是激活的,得進(jìn)行修改
user.is_active = 0
user.save()
# 返回應(yīng)答,跳轉(zhuǎn)到首頁
return redirect(reverse("goods:index"))
配套u(yù)rl
urlpatterns = [ url(r'^register/$', views.register, name="register"), # 注冊 url(r'^register_handle/$', views.register_handle, name="register_handle"), # 注冊處理 ]
這樣雖然分工比較明確,但卻比較麻煩,要使用到兩個(gè)url和兩個(gè)處理函數(shù),眾所周知,程序員是比較懶的,所以FBV的正確打開方式如下
使用一個(gè)函數(shù)完成注冊
FBV注冊代碼
def register(request):
"""注冊"""
if request.method == 'GET':
return render(request, "register.html")
# 接收數(shù)據(jù)
username = request.POST.get("user_name")
password = request.POST.get("pwd")
email = request.POST.get("email")
allow = request.POST.get("allow")
# 進(jìn)行數(shù)據(jù)校驗(yàn),all方法可以進(jìn)行迭代,如果有內(nèi)容為空的,返回false
if not all([username, password, email]):
# 數(shù)據(jù)不完整
return render(request, "register.html", {"errormsg": "數(shù)據(jù)不完整"})
# 郵箱校驗(yàn)
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": "郵箱格式不正確"})
# 協(xié)議是否同意校驗(yàn)
if allow != "on":
# 用戶不同意協(xié)議
return render(request, "register.html", {"errormsg": "請同意協(xié)議"})
# 校驗(yàn)用戶名是否重復(fù)
try:
user = models.User.objects.get(username=username)
except models.User.DoesNotExist:
# 用戶名不存在
user = None
if user:
return render(request, "register.html", {"errormsg": "用戶名已存在"})
# 進(jìn)行業(yè)務(wù)處理:進(jìn)行用戶注冊
# 使用Django默認(rèn)的認(rèn)證系統(tǒng)
user = models.User.objects.create_user(username, email, password)
# 因?yàn)槟J(rèn)注冊后用戶是激活的,得進(jìn)行修改
user.is_active = 0
user.save()
# 返回應(yīng)答,跳轉(zhuǎn)到首頁
return redirect(reverse("goods:index"))
配套u(yù)rl
urlpatterns = [ url(r'^register/$', views.register, name="register"), # 注冊 ]
但此時(shí)問題又來了,我們知道,在http中請求的方式有g(shù)et,post,head,options,put,delete,trace,connect等多種方式,從網(wǎng)上盜了一張圖來描述這些請求,原圖鏈接地址為:http://www.dhdzp.com/article/170023.htm

而上面的只處理了get和post,雖然我們可以再定義其他的函數(shù)和url來處理,或者通過if判斷來進(jìn)行區(qū)別對待,但這明顯會(huì)顯得麻煩,此時(shí),我們可以使用CBV來解決這個(gè)問題。
CBV
CBV,即 class base views,類視圖,在視圖里使用類處理請求。
CBV代碼可以解決諸多請求方式的問題,具備可讀性,同時(shí)也更加符合面向?qū)ο缶幊獭?/p>
使用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):
"""進(jìn)行注冊處理"""
# 接收數(shù)據(jù)
username = request.POST.get("user_name")
password = request.POST.get("pwd")
email = request.POST.get("email")
allow = request.POST.get("allow")
# 進(jìn)行數(shù)據(jù)校驗(yàn),all方法可以進(jìn)行迭代,如果有內(nèi)容為空的,返回false
if not all([username, password, email]):
# 數(shù)據(jù)不完整
return render(request, "register.html", {"errormsg": "數(shù)據(jù)不完整"})
# 郵箱校驗(yàn)
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": "郵箱格式不正確"})
# 協(xié)議是否同意校驗(yàn)
if allow != "on":
# 用戶不同意協(xié)議
return render(request, "register.html", {"errormsg": "請同意協(xié)議"})
# 校驗(yàn)用戶名是否重復(fù)
try:
user = models.User.objects.get(username=username)
except models.User.DoesNotExist:
# 用戶名不存在
user = None
if user:
return render(request, "register.html", {"errormsg": "用戶名已存在"})
# 進(jìn)行業(yè)務(wù)處理:進(jìn)行用戶注冊
# 使用Django默認(rèn)的認(rèn)證系統(tǒng)
user = models.User.objects.create_user(username, email, password)
# 因?yàn)槟J(rèn)注冊后用戶是激活的,得進(jìn)行修改
user.is_active = 0
user.save()
# 發(fā)送激活郵件,包括激活鏈接:http://127.0.0.1:8000/user/active/3
# 激活鏈接中需要包含用戶的身份信息,并且要把身份信息進(jìn)行加密
# 加密用戶的身份信息,生成激活token
serializer = Serializer(settings.SECRET_KEY, 1800)
info = {'confirm': user.id}
token = serializer.dumps(info)
token = token.decode()
# 發(fā)郵件
subject = "綠色果園歡迎信息"
message = ""
sender = settings.EMAIL_FROM
receiver = [email]
html_message = "<h2>%s, 歡迎你成為綠色果園注冊會(huì)員</h2></br>請點(diǎn)擊以下鏈接激活賬號<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)
# 返回應(yīng)答,跳轉(zhuǎn)到首頁
return redirect(reverse("goods:index"))
配套u(yù)rl
from user.views import RegisterView urlpatterns = [ url(r'^register/$', RegisterView.as_view(), name="register"), # 注冊 ]
總結(jié)
以上所述是小編給大家介紹的Django中的FBV和CBV用法詳解,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
使用Python開發(fā)SQLite代理服務(wù)器的方法
今天小編就為大家分享一篇使用Python開發(fā)SQLite代理服務(wù)器的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
python hash每次調(diào)用結(jié)果不同的原因
這篇文章主要介紹了python hash每次調(diào)用結(jié)果不同的原因,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Python解析器Cpython的GIL解釋器鎖工作機(jī)制
這篇文章主要為大家介紹了Cpython的GIL解釋器鎖工作機(jī)制掌握示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Python為何不能用可變對象作為默認(rèn)參數(shù)的值
這篇文章主要介紹了Python為何不能用可變對象作為默認(rèn)參數(shù)的值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
python cv2在驗(yàn)證碼識別中應(yīng)用實(shí)例解析
這篇文章主要介紹了python cv2在驗(yàn)證碼識別中應(yīng)用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

