Django中的FBV和CBV用法詳解
FBV
FBV,即 func base views,函數(shù)視圖,在視圖里使用函數(shù)處理請求。
以用戶注冊代碼為例,
使用兩個函數(shù)完成注冊
初級注冊代碼
def register(request): """返回注冊頁面""" return render(request, "register.html") def register_handle(request): """進行注冊處理""" # 接收數(shù)據(jù) username = request.POST.get("user_name") password = request.POST.get("pwd") email = request.POST.get("email") allow = request.POST.get("allow") # 進行數(shù)據(jù)校驗,all方法可以進行迭代,如果有內容為空的,返回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é)議"}) # 校驗用戶名是否重復 try: user = models.User.objects.get(username=username) except models.User.DoesNotExist: # 用戶名不存在 user = None if user: return render(request, "register.html", {"errormsg": "用戶名已存在"}) # 進行業(yè)務處理:進行用戶注冊 # 使用Django默認的認證系統(tǒng) 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和兩個處理函數(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") # 進行數(shù)據(jù)校驗,all方法可以進行迭代,如果有內容為空的,返回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é)議"}) # 校驗用戶名是否重復 try: user = models.User.objects.get(username=username) except models.User.DoesNotExist: # 用戶名不存在 user = None if user: return render(request, "register.html", {"errormsg": "用戶名已存在"}) # 進行業(yè)務處理:進行用戶注冊 # 使用Django默認的認證系統(tǒng) 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等多種方式,從網(wǎng)上盜了一張圖來描述這些請求,原圖鏈接地址為:http://chabaoo.cn/article/170023.htm
而上面的只處理了get和post,雖然我們可以再定義其他的函數(shù)和url來處理,或者通過if判斷來進行區(qū)別對待,但這明顯會顯得麻煩,此時,我們可以使用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): """進行注冊處理""" # 接收數(shù)據(jù) username = request.POST.get("user_name") password = request.POST.get("pwd") email = request.POST.get("email") allow = request.POST.get("allow") # 進行數(shù)據(jù)校驗,all方法可以進行迭代,如果有內容為空的,返回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é)議"}) # 校驗用戶名是否重復 try: user = models.User.objects.get(username=username) except models.User.DoesNotExist: # 用戶名不存在 user = None if user: return render(request, "register.html", {"errormsg": "用戶名已存在"}) # 進行業(yè)務處理:進行用戶注冊 # 使用Django默認的認證系統(tǒng) user = models.User.objects.create_user(username, email, password) # 因為默認注冊后用戶是激活的,得進行修改 user.is_active = 0 user.save() # 發(fā)送激活郵件,包括激活鏈接: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() # 發(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) # 返回應答,跳轉到首頁 return redirect(reverse("goods:index"))
配套url
from user.views import RegisterView urlpatterns = [ url(r'^register/$', RegisterView.as_view(), name="register"), # 注冊 ]
總結
以上所述是小編給大家介紹的Django中的FBV和CBV用法詳解,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!
相關文章
Python之NumPy(axis=0 與axis=1)區(qū)分詳解
這篇文章主要介紹了Python之NumPy(axis=0 與axis=1)區(qū)分詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧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庫做一個鼠標模擬點擊器
這篇文章主要介紹了Python實戰(zhàn)之用tkinter庫做一個鼠標模擬點擊器,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04