Django之FBV和CBV的用法
- 2019 年 10 月 3 日
- 筆記
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://www.cnblogs.com/weibanggang/p/9454581.html
而上面的只處理了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"), # 註冊 ]