この記事は、Python での Django ビューの詳細な説明 (例付き) を提供します。一定の参考価値があります。必要な友人は参照できます。お役に立てれば幸いです。
ビューと呼ばれるビュー関数 (クラス) は、ビジネス ロジックを含む単純な Python 関数 (クラス) であり、Web リクエストを受け入れ、Web レスポンスを返します。
応答には、Web ページの HTML コンテンツ、リダイレクト、404 エラー、XML ドキュメント、または画像を指定できます。
ビュー自体にどのようなロジックが含まれているかに関係なく、応答を返す必要があります。現在のプロジェクト ディレクトリ内であれば、コードがどこに書かれていても問題ありません。それ以上は何も必要ありません。いわば「何も魔法のようなものはありません」。
コードをどこかに配置するには、プロジェクトまたはアプリケーション ディレクトリ内の views.py という名前のファイルにビューを配置するのが一般的な規則です。
例: 現在の日付と時刻を HTML ドキュメントの形式で返すビュー:
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
上記のコードを 1 行ずつ説明しましょう:
まず、 django.http モジュールは、HttpResponse クラスと Python の datetime ライブラリをインポートします。
次に、current_datetime 関数を定義します。ビュー機能です。各ビュー関数は最初のパラメータとして HttpRequest オブジェクトを受け取り、通常は request と呼ばれます。
ビュー関数の名前は重要ではないことに注意してください。Django が認識できるように一貫した方法で名前を付ける必要はありません。この名前は、実装する関数をより正確に反映できるため、current_datetime という名前を付けました。
このビューは、生成された応答を含む HttpResponse オブジェクトを返します。各ビュー関数は、HttpResponse オブジェクトを返す役割を果たします。
Django は、リクエスト オブジェクトとレスポンス オブジェクトを使用して、システムを通じて状態を渡します。
ブラウザがサーバーにページをリクエストすると、Django はリクエストに関するメタデータを含む HttpRequest オブジェクトを作成します。次に、Django は対応するビューをロードし、この HttpRequest オブジェクトを最初のパラメーターとしてビュー関数に渡します。
各ビューは、HttpResponse オブジェクトを返す責任があります。
CBV (クラスベース ビュー) と FBV (関数ベース ビュー)
関数ベースのビューは FBV と呼ばれ、ビューはクラスベースとして記述することもできます。
FBV バージョン
# FBV版添加班级 以函数的方式实现 def add_class(request): if request.method == "POST": class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/") return render(request, "add_class.html")
CBV バージョン
# CBV版添加班级 以类的方式实现 from django.views import View class AddClass(View): # 继承View中的所有属性 def get(self, request): # 如果是get请求,就执行此段函数 return render(request, "add_class.html") def post(self, request): # 如果是post,请求就执行此段函数 class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
注: CBV を使用する場合、対応する変更を urls.py で行う必要があります:
# urls.py中,要加括号 url(r'^add_class/$', views.AddClass.as_view()), # 注意: Addclass中并没有定义as_view方法,而是继承view中的方法,从而使其按照 #相应条件执行相应程序. 流程 1. AddPress.as_view() —— 》 view函数 2. 当请求到来的时候执行view函数: 1. 实例化自己写的类 —— 》self self = cls(**initkwargs) 2. self.request = request 3. 执行 self.dispatch(request, *args, **kwargs) 1. 执行父类中的dispatch方法 1. 判断请求方式是否被允许 1. 允许的情况 handler = 通过反射获取 get post 方法(指的是自己定义的类中的方法) 2. 不允许的情况 handler = 不允许的方法 3. handler(request, *args, **kwargs) 2. 返回HttpResponse对象 4. 返回HttpResponse对象 给django
view メソッドを継承することで、論理的なビジネスを完了するのに役立ちます。関数 (post、get、filter などの 8 つの受信メソッド) は FBV よりも簡潔です。
CBV バージョンは if 判定を必要とせず、よりモジュール化されています。
CBV バージョンにはデコレータが追加されました
クラス内のメソッドは独立した関数とまったく同じではないため、関数デコレータをクラス内のメソッドに直接適用することはできません。最初にメソッド デコレータに変換する必要があります。
Django は、関数デコレータをメソッド デコレータに変換するための method_decorator デコレータを提供します。
#方法 1:
# CBV を使用する場合は注意してください。到着後、最初にdispatch()メソッドが実行されます。getやpostなどの特定のリクエスト処理メソッドをバッチで実行する必要がある場合は、ここでディスパッチメソッドを手動で書き換えることができます。 FBV に装飾を追加するのと同じです。デバイスの効果は同じです。
##方法 2:
FBV にデコレータを追加
##リクエスト オブジェクト
ページがリクエストされると、Django はリクエストの元の情報を含む HttpRequest オブジェクトを作成します。 Django はこのオブジェクトを対応するビュー関数に自動的に渡します。通常、ビュー関数はこのオブジェクトを受け取るためにリクエスト パラメーターを使用します。
リクエストに関連する共通の値
属性:
Django は、リクエスト メッセージ内のリクエスト行、ヘッダー情報、コンテンツ本文を HttpRequest クラスの属性にカプセル化します。
特別な命令を除いて、その他はすべて読み取り専用です。
0.HttpRequest.scheme
リクエスト スキーム (通常は http または https) を表す文字列
1. HttpRequest.body
A 文字列 は、 を表します。リクエストメッセージの本文。バイナリ イメージ、XML、Json などの非 HTTP メッセージを処理する場合に非常に便利です。
ただし、フォームデータを処理したい場合は、HttpRequest.POST を使用することをお勧めします。
その他、Pythonのクラスファイルメソッドを利用して操作することもできます(詳しくはHttpRequest.read()を参照してください)。
2. HttpRequest.path
リクエストのパス コンポーネントを表す文字列 (ドメイン名を除く)。
例: "/music/bands/the_beatles/"
3. HttpRequest.method
リクエストで使用される HTTP メソッドを示す文字列。大文字を使用する必要があります。
例: "GET"、"POST"
4、HttpRequest.encoding
送信されたデータのエンコード方式を示す文字列 (None の場合、 DEFAULT_CHARSET 設定を使用することを意味します。デフォルトは「utf-8」です)。
この属性は書き込み可能であり、これを変更してフォーム データへのアクセスに使用されるエンコーディングを変更できます。
その後のプロパティへのアクセス (GET または POST からのデータの読み取りなど) では、新しいエンコード値が使用されます。
フォーム データのエンコーディングが DEFAULT_CHARSET ではないことがわかっている場合は、それを使用してください。
5. HttpRequest.GET
HTTP GET のすべてのパラメータを含む辞書のようなオブジェクト。詳細については、QueryDict オブジェクトを参照してください。
6. HttpRequest.POST
辞書のようなオブジェクトリクエストにフォーム データが含まれている場合、データは QueryDict オブジェクトにカプセル化されます。
POST リクエストには空の POST ディクショナリを含めることができます。フォームが HTTP POST メソッド経由で送信されたが、フォーム内にデータがない場合でも、QueryDict オブジェクトは作成されます。
したがって、POST メソッドが使用されているかどうかを確認するために if request.POST を使用するべきではありません。if request.method == "POST"
さらに、次の場合を使用する必要があります。 POST を使用してアップロードします。 ファイルの場合、ファイル情報は FILES 属性に含まれます。
7. HttpRequest.COOKIES
すべての Cookie を含む標準の Python 辞書。キーと値は両方とも文字列です。
8. HttpRequest.FILES
アップロードされたすべてのファイル情報を含む辞書のようなオブジェクト。
FILES の各キーは の名前であり、値は対応するデータです。
FILES には、リクエスト メソッドが POST で、送信された