Djangoベース3.0、ビュー関数

15870 ワード

Django3.0
 -----参考:clsスーパー:アドレスポイントここ
CBVとFBV
FBV (function based view)  ビューで関数を使用してリクエストを処理する
def home(request):
    print('home!!!')
    return render(request,'home.html')

CBV (class based view)  ビューでクラス処理リクエストを使用する
  • はコードの多重性を高める、Mixin(マルチ継承)
  • のようなオブジェクト向けの技術を用いることができる.
  • は、多くのif判定によりコード可読性を向上するのではなく、異なるHTTP方法に対して異なる関数で処理することができる
  • .
    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(" ")

     
  • アクセサリーを追加する前に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
     
    要求に関連する属性メソッド
    しばらくの間
    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      ,        ;            
          ,                           。
  • 仮リダイレクト(レスポンスステータスコード:302)と永久リダイレクト(レスポンスステータスコード:301)は、一般ユーザーにとって何の違いもなく、主に検索エンジンのロボット
  • に向いている.
     
    転載先:https://www.cnblogs.com/CatdeXin/p/11217799.html