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要求オブジェクトの共通属性
三、HttpResponse(応答対象)
応答オブジェクトは、サーバがブラウザに返す情報であり、応答情報は任意の形式のコンテンツであってもよい.
例えば、Htmlページのコンテンツ、リダイレクトされたコンテンツ(サードパーティであってもよい)、404エラー、xmlドキュメント、またはピクチャなどである.要するに、ビュー自体にどんな論理が含まれているかにかかわらず、応答を返します.具体的には、応答オブジェクトには主に3つの形式があります.
(覚えておいてください:djangoはすべての応答情報の方式で、彼らはすべて1つのHttpResponseオブジェクトに属しています)
3.1 HttpResponse()応答文字列
括弧内に応答体として具体的な文字列を直接書くのは、比較的直接的で簡単なので、ここでは主に後の2つの形式を紹介します.
3.2 render()応答htmlページ
パラメータ: request:応答を生成するための要求オブジェクトであり、入力する必要がある最初のパラメータ を固定する. templates_name:使用するテンプレートの完全な名前は、入力する必要があります.renderはデフォルトでtemplatesフォルダの下でこのhtmlページ(テンプレートファイル) を探します. context:オプションのパラメータで、モジュールファイルの変数 の代わりに辞書を送信できます.
まとめ:renderの機能は、テンプレートファイルを所定の辞書に従ってレンダリングし、レンダリング後のHttpResponseオブジェクトを返すことにまとめられます.
3.3 redirect()リダイレクト
3.4リダイレクトステータスコード301と302の違い(了解)
四、JsonResponse(json文字列を返す)
フロントエンドにjson形式の文字列を返す2つの方法
方式一:jsonモジュールを介して
方法2:JsonResponseオブジェクトを介して
JsonResponseオブジェクトはデフォルトでは辞書をシーケンス化するしかありません.他のタイプをシーケンス化するには
また、中国語を表示するには
4.1補足小例:python中のJson任意フォーマット徐磊話をどのように手動で実現するかクラス継承jsonを書きます.JSONNcoder,defaultメソッドを書き換え,jsonが回転可能なタイプ を返す.シーケンス化、クラスを指定し、ASCIIコードを使用しない解析 を指定する.
五、formフォームアップロードファイル
注意事項:提出方式はpost でなければならない. enctypeパラメータにはデフォルトのurlencodedがformdata になる必要があります. request.FILES取得ファイルオブジェクト 5.1ファイルをアップロードする2つの方法
六、FBVとCBV
djangoのビューレイヤはFBVとCBVの2つの形式で構成されています. FBV関数ベースビュー(function base view):私たちがこれまで紹介してきたのはFBV です. CBVクラスベースビュー(class base view):カスタムクラス継承Viewクラスによるgetおよびpostメソッド の実装
6.1 CBVを実現する方法まずビューレイヤで:カスタムクラスはViewクラスから継承され、getメソッドとpostメソッド が書き換えられます.まずルーティング層において、ルーティングとビュー関数の対応関係 を追加する.
6.2 CBVの実行フローを分析する
なぜフロントエンドgetリクエストが来るとgetメソッドがトリガーされるのですか?まず、ルーティングレイヤに 実行後の結果、閉パッケージ関数オブジェクトが得られます.このときルーティング層のurlは となる.ブラウザがアクセスすると、urlが正常に一致すると、閉パッケージ関数が呼び出されます. は閉パッケージ関数を実行し、まず自分のカスタムクラスを得たオブジェクトをインスタンス化し、属性を追加します.次に、オブジェクトの が実行する.は、
一、ビュー関数
ビュー関数、略称ビュー、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])
パラメータ:
まとめ: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モジュールがどのタイプのシーケンス化をサポートしているかを見ることができます.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フォームアップロードファイル
注意事項:
''' '''
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つの形式で構成されています.
6.1 CBVを実現する方法
# 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(r'^login/', views.view)
となり、このときルーティング構成では他と同様にメモリアドレスdispatch
メソッドdispatch
メソッド内で、要求タイプが要求に合致するか否かを判断し、反射によりカスタムクラス内の関数を得て、最後にこの関数を呼び出す.