欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django中的FBV和CBV用法詳解

 更新時間:2019年09月15日 11:08:40   作者:YifChan  
這篇文章主要介紹了Django中的FBV和CBV用法詳解,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下

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)文章

  • pytorch訓(xùn)練imagenet分類的方法

    pytorch訓(xùn)練imagenet分類的方法

    今天小編就為大家分享一篇pytorch訓(xùn)練imagenet分類的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python map函數(shù)()用法

    Python map函數(shù)()用法

    map()函數(shù)是Python中的一個內(nèi)置函數(shù),它的功能是將指定的函數(shù),依次作用于可迭代對象的每個元素,并返回一個迭代器對象,這篇文章主要介紹了Python map函數(shù)()用法,需要的朋友可以參考下
    2023-07-07
  • Python之NumPy(axis=0 與axis=1)區(qū)分詳解

    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)

    下面小編就為大家分享一篇淺談配置OpenCV3 + Python3的簡易方法(macOS),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 簡單談?wù)刾ython的反射機(jī)制

    簡單談?wù)刾ython的反射機(jī)制

    本文主要介紹python中的反射,以及該機(jī)制的簡單應(yīng)用,熟悉JAVA的程序員,一定經(jīng)常和Class.forName打交道。在很多框架中(Spring,eclipse plugin機(jī)制)都依賴于JAVA的反射能力,而在python中,也同樣有著強(qiáng)大的反射能力,本文將做簡單的介紹
    2016-06-06
  • Opencv中的cv2.calcHist()函數(shù)的作用及返回值說明

    Opencv中的cv2.calcHist()函數(shù)的作用及返回值說明

    這篇文章主要介紹了Opencv中的cv2.calcHist()函數(shù)的作用及返回值說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python實戰(zhàn)之用tkinter庫做一個鼠標(biāo)模擬點擊器

    Python實戰(zhàn)之用tkinter庫做一個鼠標(biāo)模擬點擊器

    這篇文章主要介紹了Python實戰(zhàn)之用tkinter庫做一個鼠標(biāo)模擬點擊器,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Python實現(xiàn)批量獲取當(dāng)前文件夾下的文件名

    Python實現(xiàn)批量獲取當(dāng)前文件夾下的文件名

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)批量獲取當(dāng)前文件夾下的文件名,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Python設(shè)置Word全局樣式和文本樣式的示例代碼

    Python設(shè)置Word全局樣式和文本樣式的示例代碼

    這篇文章主要介紹了如何利用Python對Word內(nèi)容進(jìn)行各種樣式的設(shè)置,讓其能夠看起來更加的美觀。文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • Python中刪除文件的幾種方法實例

    Python中刪除文件的幾種方法實例

    這篇文章主要給大家介紹了關(guān)于Python中刪除文件的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論