Djangoベース3.0、ビュー関数
15870 ワード
Django3.0
-----参考:clsスーパー:アドレスポイントここ
CBVとFBV
FBV (function based view) ビューで関数を使用してリクエストを処理する
CBV (class based view) ビューでクラス処理リクエストを使用するはコードの多重性を高める、Mixin(マルチ継承) のようなオブジェクト向けの技術を用いることができる.は、多くのif判定によりコード可読性を向上するのではなく、異なるHTTP方法に対して異なる関数で処理することができる .
views.py
urls.py
CBVは異なるリクエストメソッドによって対応するクラス内のメソッドを見つける(理解)
CBVのディスパッチ方法
ビューにデコレーションを付ける
装飾器でFBVを飾る
FBV自体が関数なので、普通の関数家の装飾器とは違いません.
アクセサリーを使ってCBVを飾る
クラスの方式は独立関数と全く同じではないので,直接関数装飾をクラスに完全に適用する方法はできないが,まずそれをメソッド装飾器に変換する必要がある.
Django体重method_decoratorデコレーション関数デコレーションをメソッドデコレーションに変換するために使用
アクセサリーを追加する前にfrom django.utils.decorators import method_decorator をインポートする必要があります.アクセラレータを追加するフォーマットは@method_decorator()でなければなりません.カッコの中にはアクセラレータの関数名 があります.クラスに追加するにはname を宣言する必要があります. csrf-token装飾器の特殊性に注意し、CBVモードではdispatchにしか加算できない(後述) 次はcsrf_tokenのアクセサリーです.
@csrf_protectは、settingsにcsrfTokenグローバルミドルウェアが設定されていなくても、現在の関数に対して強制的にクロスステーション要求偽造防止機能を設定します.
@csrf_exemptでは、settingsにグローバルミドルウェアが設定されている場合でも、現在の関数のクロスステーション要求偽造防止機能をキャンセルします.
注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect
要求に関連する属性メソッド
しばらくの間
レスポンス関連メソッド
しばらくの間
知識点の拡張仮リダイレクト(レスポンスステータスコード:302)と永久リダイレクト(レスポンスステータスコード:301)は、一般ユーザーにとって何の違いもなく、主に検索エンジンのロボット に向いている.
転載先:https://www.cnblogs.com/CatdeXin/p/11217799.html
-----参考:clsスーパー:アドレスポイントここ
CBVとFBV
FBV (function based view) ビューで関数を使用してリクエストを処理する
def home(request):
print('home!!!')
return render(request,'home.html')
CBV (class based view) ビューでクラス処理リクエストを使用する
views.py
from django.views import View
class LoginView(View):
#
def get(self,request):
return render(request,'login2.html')
def post(self,request):
username = request.POST.get('uname')
password = request.POST.get('pwd')
print(username,password)
return HttpResponse(' !')
urls.py
url(r'^login2/', views.LoginView.as_view()),
CBVは異なるリクエストメソッドによって対応するクラス内のメソッドを見つける(理解)
#
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
CBVのディスパッチ方法
from django.views import View
class LoginView(View):
# GET
def dispatch(self, request, *args, **kwargs):
#
ret = super().dispatch(request, *args, **kwargs)
#
return ret
def get(self,request):
print('get ')
return render(request,'login2.html')
def post(self,request):
username = request.POST.get('uname')
password = request.POST.get('pwd')
print(username,password)
return HttpResponse(' !')
ビューにデコレーションを付ける
装飾器でFBVを飾る
FBV自体が関数なので、普通の関数家の装飾器とは違いません.
def func(s1):
def inner(*args,**kwargs):
print(' ')
ret = s1(*args,**kwargs)
print(' ')
return ret
return inner
@inner
def home(request):
print('home!!!')
return render(request,'home.html')
アクセサリーを使ってCBVを飾る
クラスの方式は独立関数と全く同じではないので,直接関数装飾をクラスに完全に適用する方法はできないが,まずそれをメソッド装飾器に変換する必要がある.
Django体重method_decoratorデコレーション関数デコレーションをメソッドデコレーションに変換するために使用
def adroner(func):
def inner(*args,**kwargs):
print(" ")
ret = func(*args,**kwargs)
print(" ")
return ret
return inner
# @method_decorator(adroner,name="get") # get
class LoginTest(View): # View
@method_decorator(adroner) #
def dispatch(self, request, *args, **kwargs):
#
ret = super().dispatch(request, *args, **kwargs)
#
return ret
@method_decorator(adroner) # get
def get(self,request):
return render(request,"login2.html")
def post(self,request):
username = request.POST.get("username")
password = request.POST.get("password")
print(username,"
"+password)
return HttpResponse(" ")
@csrf_protectは、settingsにcsrfTokenグローバルミドルウェアが設定されていなくても、現在の関数に対して強制的にクロスステーション要求偽造防止機能を設定します.
@csrf_exemptでは、settingsにグローバルミドルウェアが設定されている場合でも、現在の関数のクロスステーション要求偽造防止機能をキャンセルします.
注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect
要求に関連する属性メソッド
しばらくの間
def index(request): #http --- --HttpRequest
if request.method == 'GET':
print(request.body) # post (b'username=dazhuang')
print(request.GET) # GET
# print(request.META) # ,
print(request.path) #/index/
print(request.path_info) #/index/
print(request.get_full_path()) #/index/?username=dazhuang&password=123
print(request.POST) # POST
レスポンス関連メソッド
しばらくの間
HttpResponse ---
render --- html
redirect --
:
from django.shortcuts import render,HttpResponse,redirect
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'taibai' and password == 'dsb':
# return render(request,'home.html')
return redirect('/home/') #
else:
return HttpResponse(' !!!')
#
def home(request):
return render(request,'home.html')
知識点の拡張
1)301 302 。
301 302 , URL , Location
( A B)—— 。
。301 A ( ), ;
302 A ( ), A B, 。 SEO302 301
2) :
(1) ( );
(2) ;
(3) ( .php .Html .shtml)。
, , 404 , ;
, 。
転載先:https://www.cnblogs.com/CatdeXin/p/11217799.html