Django中的FBV和CBV用法詳解
FBV
FBV,即 func base views,函數(shù)視圖,在視圖里使用函數(shù)處理請求。
以用戶注冊代碼為例,
使用兩個函數(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ù)校驗,all方法可以進(jìn)行迭代,如果有內(nèi)容為空的,返回false if not all([username, password, email]): # 數(shù)據(jù)不完整 return render(request, "register.html", {"errormsg": "數(shù)據(jù)不完整"}) # 郵箱校驗 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é)議是否同意校驗 if allow != "on": # 用戶不同意協(xié)議 return render(request, "register.html", {"errormsg": "請同意協(xié)議"}) # 校驗用戶名是否重復(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) # 因為默認(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"), # 注冊處理 ]
這樣雖然分工比較明確,但卻比較麻煩,要使用到兩個url和兩個處理函數(shù),眾所周知,程序員是比較懶的,所以FBV的正確打開方式如下
使用一個函數(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ù)校驗,all方法可以進(jìn)行迭代,如果有內(nèi)容為空的,返回false if not all([username, password, email]): # 數(shù)據(jù)不完整 return render(request, "register.html", {"errormsg": "數(shù)據(jù)不完整"}) # 郵箱校驗 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é)議是否同意校驗 if allow != "on": # 用戶不同意協(xié)議 return render(request, "register.html", {"errormsg": "請同意協(xié)議"}) # 校驗用戶名是否重復(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) # 因為默認(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"), # 注冊 ]
但此時問題又來了,我們知道,在http中請求的方式有g(shù)et,post,head,options,put,delete,trace,connect等多種方式,從網(wǎng)上盜了一張圖來描述這些請求,原圖鏈接地址為:http://www.dbjr.com.cn/article/170023.htm
而上面的只處理了get和post,雖然我們可以再定義其他的函數(shù)和url來處理,或者通過if判斷來進(jìn)行區(qū)別對待,但這明顯會顯得麻煩,此時,我們可以使用CBV來解決這個問題。
CBV
CBV,即 class base views,類視圖,在視圖里使用類處理請求。
CBV代碼可以解決諸多請求方式的問題,具備可讀性,同時也更加符合面向?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ù)校驗,all方法可以進(jìn)行迭代,如果有內(nèi)容為空的,返回false if not all([username, password, email]): # 數(shù)據(jù)不完整 return render(request, "register.html", {"errormsg": "數(shù)據(jù)不完整"}) # 郵箱校驗 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é)議是否同意校驗 if allow != "on": # 用戶不同意協(xié)議 return render(request, "register.html", {"errormsg": "請同意協(xié)議"}) # 校驗用戶名是否重復(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) # 因為默認(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, 歡迎你成為綠色果園注冊會員</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) # 返回應(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用法詳解,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!
相關(guān)文章
Python之NumPy(axis=0 與axis=1)區(qū)分詳解
這篇文章主要介紹了Python之NumPy(axis=0 與axis=1)區(qū)分詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05淺談配置OpenCV3 + Python3的簡易方法(macOS)
下面小編就為大家分享一篇淺談配置OpenCV3 + Python3的簡易方法(macOS),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Opencv中的cv2.calcHist()函數(shù)的作用及返回值說明
這篇文章主要介紹了Opencv中的cv2.calcHist()函數(shù)的作用及返回值說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11Python實戰(zhàn)之用tkinter庫做一個鼠標(biāo)模擬點擊器
這篇文章主要介紹了Python實戰(zhàn)之用tkinter庫做一個鼠標(biāo)模擬點擊器,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Python實現(xiàn)批量獲取當(dāng)前文件夾下的文件名
這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)批量獲取當(dāng)前文件夾下的文件名,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Python設(shè)置Word全局樣式和文本樣式的示例代碼
這篇文章主要介紹了如何利用Python對Word內(nèi)容進(jìn)行各種樣式的設(shè)置,讓其能夠看起來更加的美觀。文中的示例代碼講解詳細(xì),需要的可以參考一下2022-05-05