Djangoフレームのビューレイヤ

7336 ワード

目次
  • 一、ビュー関数
  • 二、要求対象(HttpRequest)
  • 2.1要求オブジェクトの共通属性
  • 三、HttpResponse(応答対象)
  • 3.1 HttpResponse()応答文字列
  • 3.2 render()応答htmlページ
  • 3.3 redirect()リダイレクト
  • 3.4リダイレクトステータスコード301と302の違い(了解)
  • 四、JsonResponse(json文字列を返す)
  • 方式一:jsonモジュール
  • を介して
  • 方式2:JsonResponseオブジェクト
  • 経由
  • 4.1補足小例:pythonにおけるJson任意フォーマット徐磊話
  • を手動で実現する方法
  • 五、formフォームアップロードファイル
  • 5.1ファイルをアップロードする2つの方法
  • 6、FBV、CBV
  • 6.1 CBVを実現する方法
  • 6.2分析CBVの実行フロー

  • 一、ビュー関数
    ビュー関数、略称ビュー、Djangoのビューレイヤに属し、デフォルトはviewsに定義されている.pyファイルにあります.
    Webリクエスト情報や応答情報を処理するための関数であるため,ビュー関数を研究するには2つのオブジェクトを把握するだけでよい.
    リクエスト・オブジェクト(HttpRequest)
    応答オブジェクト(HttpResponse)
    二、要求対象(HttpRequest)
    Djangoは、httpプロトコルリクエストデータ・レポートのリクエスト・ヘッダ、リクエスト・ヘッダ、r、リクエスト・コンテンツ・ボディをHttpRequestオブジェクトにカプセル化します(Webフレームワークをカスタマイズしたenvパラメータと同様).
    Djangoは、HttpRequestオブジェクトをパラメータとしてビュー関数の最初のパラメータrequestに渡します.ビュー関数では、そのオブジェクトのプロパティにアクセスすることでhttpプロトコルのリクエストデータを抽出できます.
    2.1要求オブジェクトの共通属性
     、HttpRequest.method
                       (GET/POST)
          :            'GET' 'POST'
          :                      
        
     、HttpRequest.GET
                  QueryDict  ,   GET       
           HttpRequest.GET.get('        (key)')       value
        
     、HttpRequest.POST
        (         )
                  QueryDict  ,   GET       
           HttpRequest.POST.get('        (key)')       value

    三、HttpResponse(応答対象)
    応答オブジェクトは、サーバがブラウザに返す情報であり、応答情報は任意の形式のコンテンツであってもよい.
    例えば、Htmlページのコンテンツ、リダイレクトされたコンテンツ(サードパーティであってもよい)、404エラー、xmlドキュメント、またはピクチャなどである.要するに、ビュー自体にどんな論理が含まれているかにかかわらず、応答を返します.具体的には、応答オブジェクトには主に3つの形式があります.
    (覚えておいてください:djangoはすべての応答情報の方式で、彼らはすべて1つのHttpResponseオブジェクトに属しています)
    # HttpResponse       
    from django.shortcuts import render #   html  
    from django.shortcuts import HttpResponse #        ,
    from django.shortcuts import redirect #    

    3.1 HttpResponse()応答文字列
    括弧内に応答体として具体的な文字列を直接書くのは、比較的直接的で簡単なので、ここでは主に後の2つの形式を紹介します.
    3.2 render()応答htmlページrender(request,templates_name[,context])
    パラメータ:
  • request:応答を生成するための要求オブジェクトであり、入力する必要がある最初のパラメータ
  • を固定する.
  • templates_name:使用するテンプレートの完全な名前は、入力する必要があります.renderはデフォルトでtemplatesフォルダの下でこのhtmlページ(テンプレートファイル)
  • を探します.
  • context:オプションのパラメータで、モジュールファイルの変数
  • の代わりに辞書を送信できます.
    まとめ:renderの機能は、テンプレートファイルを所定の辞書に従ってレンダリングし、レンダリング後のHttpResponseオブジェクトを返すことにまとめられます.
    3.3 redirect()リダイレクト
    #        
    def index(request):
        return redirect('login/')
    
    #                url
    def index(request):
        return redirect('http://www.baidu.com/')

    3.4リダイレクトステータスコード301と302の違い(了解)
     、301   302    
        1.    :
        301 302          ,                                  url  (        location      ),             a             B
        
        2.    
        301     A            ,            ,                            
        302     A     ,           ,              A     B,           、         。 SEO    ,302   301
        
        
     、     :
        1.     (          )
        2.          
        3.       (      .php  .Html .shtml).
             ,        ,                             404      ,         ;              ,                          

    四、JsonResponse(json文字列を返す)
    フロントエンドにjson形式の文字列を返す2つの方法
    方式一:jsonモジュールを介して
    import json
    def my_view(request):
        data = ['cecilia','xichen']
        return HttpResponse(json.dumps(data))

    方法2:JsonResponseオブジェクトを介して
    JsonResponseオブジェクトはデフォルトでは辞書をシーケンス化するしかありません.他のタイプをシーケンス化するにはsafe=Falseが必要です.
    また、中国語を表示するには
    from django.http import JsonResponse
    
    def my_view(request):
        data = ['cecilia','xichen']
        return JsonResponse(data,safe=False)
    #   safe=True           ,safe=False              

    4.1補足小例:python中のJson任意フォーマット徐磊話をどのように手動で実現するかjson.JSONEncoder:jsonモジュールがどのタイプのシーケンス化をサポートしているかを見ることができます.
  • クラス継承jsonを書きます.JSONNcoder,defaultメソッドを書き換え,jsonが回転可能なタイプ
  • を返す.
  • シーケンス化、クラスを指定し、ASCIIコードを使用しない解析
  • を指定する.
    import json,datetime
    
    class MyJson(json.JSONEncoder):
        def default(self, o):
            if isinstance(o,datetime.datetime):
                return o.strftime('%Y-%m-%d %X')
            else:
                return super().default(o)
            
    d = datetime.datetime.now()
    #        ,   ,      
    json_str = json.dumps(d,cls=MyJson,ensure_ascii=False)
    print(json_str,type(json_str))

    五、formフォームアップロードファイル
    注意事項:
  • 提出方式はpost
  • でなければならない.
  • enctypeパラメータにはデフォルトのurlencodedがformdata
  • になる必要があります.
  • request.FILES取得ファイルオブジェクト
  • 5.1ファイルをアップロードする2つの方法
    '''      '''
    def upload(request):
        if request.method == "POST":
            print(request.POST)
            
            '''         '''
            #   1:      ,        ,  
            file_obj = request.FILES.get("myfile")
            with open(file_obj.name,'wb') as f:
                for line in file_obj:
                    f.write(line)
    
            #   2:      ,         .chunks(),  
            # with open(file_obj.name, 'wb') as f:
            #     for line in file_obj.chunks():
            #         f.write(line)
    
        return render(request,"upload.html")

    六、FBVとCBV
    djangoのビューレイヤはFBVとCBVの2つの形式で構成されています.
  • FBV関数ベースビュー(function base view):私たちがこれまで紹介してきたのはFBV
  • です.
  • CBVクラスベースビュー(class base view):カスタムクラス継承Viewクラスによるgetおよびpostメソッド
  • の実装
    6.1 CBVを実現する方法
  • まずビューレイヤで:カスタムクラスはViewクラスから継承され、getメソッドとpostメソッド
  • が書き換えられます.
  • まずルーティング層において、ルーティングとビュー関数の対応関係
  • を追加する.
    # views.py    
    from django.views import View
    class loginview(View):
        def dispatch(self,request,*args,**kwargs): #               
            
            #    url:http://127.0.0.1:8001/login/   dispatch   
            #   http        GET,     get  
            #   http        POST,     post  
            obj = super().dispatch(request,*args,**kwargs)#        dispatch  
            return obj #     obj
    
        def get(self,request):
            return render(request,'login.html')
    
        def post(self,request):
            name = request.POST.get('name')
            pwd = request.POST.get('pwd')
            if name == 'cecilia' and pwd == '123':
                res = '    '
            else:
                res = '      '
            return HttpResponse(res)
    # urls.py    
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        
        #   CBV    
        url(r'^login/',views.loginview.as_view()),#   as_view()               。
        
    ]

    6.2 CBVの実行フローを分析する
    なぜフロントエンドgetリクエストが来るとgetメソッドがトリガーされるのですか?
  • まず、ルーティングレイヤにurl(r'^login/',views.loginview.as_view())と書かれ、この文は、プロジェクトが開始されると自動的にas_view()に実行される.
  • 実行後の結果、閉パッケージ関数オブジェクトが得られます.このときルーティング層のurlはurl(r'^login/', views.view)となり、このときルーティング構成では他と同様にメモリアドレス
  • となる.
  • ブラウザがアクセスすると、urlが正常に一致すると、閉パッケージ関数が呼び出されます.
  • は閉パッケージ関数を実行し、まず自分のカスタムクラスを得たオブジェクトをインスタンス化し、属性を追加します.次に、オブジェクトのdispatchメソッド
  • が実行する.
  • は、dispatchメソッド内で、要求タイプが要求に合致するか否かを判断し、反射によりカスタムクラス内の関数を得て、最後にこの関数を呼び出す.