Django知識補充之CBV
Django:
?? url??? -->? def函數????? FBV[function based view]? 用函數和URL進行匹配
?? url??? -->? 類?????????? CBV[function based view]? 用類和URL進行匹配
POSTMAN插件
http://blog.csdn.net/zzy1078689276/article/details/77528249
?
基于CBV的登錄實例:
settings.py
INSTALLED_APPS = [...'app01', # 注冊app
]
STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),) # 現添加的配置,這里是元組,注意逗號
TEMPLATES = [...'DIRS': [os.path.join(BASE_DIR, 'templates')],
]
urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from app01 import views
urlpatterns = [# 基于CBV的登錄# url(r'^login.html/', views.login), # 原來基于函數url(r'^login.html/', views.Login.as_view()), # 現在基于類名.as_view()
]
views.py
from django.shortcuts import render, redirect
from app01 import models
# 基于CBV的登錄,需要導入views
from django import views
class Login(views.View):# http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']def get(self, request, *args, **kwargs):print(request.method, 'GGGGGGGGGGGG')message = ''return render(request, 'login.html', {'message': message}) # 這里是網頁htmldef post(self, request, *args, **kwargs):print(request.method, 'OOOOOOOOOOOOO')username = request.POST.get("user")password = request.POST.get("pass")print('username: %s, password:%s' % (username, password))# obj = models.Administrator.objects.filter(username=username, password=password).count()# if obj: 從數據庫內取出數據,進行判斷也可以if username == 'root' and password == 'root':req = redirect('/index.html/') # 接收redirect對象,# 這里是瀏覽器路徑,偽靜態# req.set_cookie('username', username, max_age=10) # 設置超時時間10simport datetimetimeout = datetime.datetime.now() + datetime.timedelta(seconds=10)req.set_cookie('username', username, max_age=10, expires=timeout)# IE設置超時時間10sreturn req# return redirect('/index.html') # 與上面3行同,只是添加了Cookieelse:message = '用戶名或密碼錯誤'return render(request, 'login.html', {'message': message}) # 這里是網頁html
templates/login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>{# 偽靜態#}<form action="/login.html/" method="post">{% csrf_token %} {# 為跨站請求 #}<div><label for="user">用戶名</label><input id="user" name="user" type="text"></div><div><label for="pass">密 碼</label><input id="pass" name="pass" type="password"></div><div><label></label><input value="登錄" type="submit"><span style="color: red">{{ message }}</span></div></form>
</body>
</html>
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8">
</head>
<body><h2>hello, {{ username }}</h2>
</body>
</html>
頁面顯示:
?
CBV基于裝飾器的使用<一>? ---基于Python舊方法
?CBV基于裝飾器的使用<一>? ---基于Python舊方法
裝飾器:函數執行之前/后可以增加擴展功能
有多個方法的時候,必須給每個方法添加裝飾器哈
CBV的反射原理
單一裝飾器
views.py
from django.shortcuts import render, redirect
from app01 import models
# 基于CBV的登錄,需要導入views
from django import views
from django.utils.decorators import method_decorator # 導入裝飾器
# 基于CBV的裝飾器的使用
def outer(func):def inner(request, *args, **kwargs):print(request.method)return func(request, *args, **kwargs)return innerclass Login(views.View):# http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']@method_decorator(outer)def get(self, request, *args, **kwargs):message = ''return render(request, 'login.html', {'message': message}) # 這里是網頁html@method_decorator(outer)def post(self, request, *args, **kwargs):username = request.POST.get("user")password = request.POST.get("pass")print('username: %s, password:%s' % (username, password))# obj = models.Administrator.objects.filter(username=username, password=password).count()# if obj: 從數據庫內取出數據,進行判斷也可以if username == 'root' and password == 'root':req = redirect('/index.html/') # 接收redirect對象,# 這里是瀏覽器路徑,偽靜態# req.set_cookie('username', username, max_age=10) # 設置超時時間10simport datetimetimeout = datetime.datetime.now() + datetime.timedelta(seconds=10)req.set_cookie('username', username, max_age=10, expires=timeout)# IE設置超時時間10sreturn req# return redirect('/index.html') # 與上面3行同,只是添加了Cookieelse:message = '用戶名或密碼錯誤'return render(request, 'login.html', {'message': message}) # 這里是網頁html
CBV基于裝飾器的使用<二>? --基于Django的dispatch[多個裝飾器]
CBV基于裝飾器的使用<二>? --基于Django的dispatch[多個裝飾器]
如果對某一種請求做處理: 單一裝飾器
如果對所有的請求做處理: dispatch單一裝飾器
添加裝飾器有2中方法:
??? 1.類上添加??
??? 2.方法上添加
自定義轉發dispatch函數
from django import views
from django.utils.decorators import method_decorator # 導入裝飾器
class Login(views.View):# http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']# 自定義轉發器,URL進來都在此處進行URL轉發,我們可以有一些預操作[函數驗證可以放此處]def dispatch(self, request, *args, **kwargs):print('自定義dispatch: 前')# if request.method == 'POST':# return HttpResponse("Good Bye") # 預操作處理# 請求先到Login的dispatch,然后調用父類的dispatch,返回結果給了objobj = super(Login, self).dispatch(request, *args, **kwargs) # 自定義轉發且調用父類dispatch# 將父類的返回結果返回給界面,否則界面報錯print('自定義dispatch: 后')return objdef get(self, request, *args, **kwargs):message = ''return render(request, 'login.html', {'message': message}) # 這里是網頁html...同上