ビューレイヤー
Pythonはビューの関数です。この最初のパラメータは、のHttpRequestの関数であり、それはインスタンスを返すのHttpResponse。Pythonのような2つの条件を満たさなければならない認識Djangoのビューを、機能するために。
どこコードビュー機能を書き込むことができますが、一般的な慣習は、プロジェクトまたはアプリケーションディレクトリに設定されている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)
のは、ラインによって上記のコード行を説明しましょう:
-
まず
django.http
、インポートモジュールのHttpResponse
クラスだけでなく、Pythonのdatetime
ライブラリ。 -
その後、我々は定義
current_datetime
関数。これは、ビュー機能です。各ビューの機能を使用して、HttpRequest
最初のパラメータとしてオブジェクトを、そして一般的に知られていますrequest
。ビュー関数の名前は重要ではないことに注意してください。Djangoはそれを認識できるようにするために、名前を命名する統一されたアプローチを必要としません。我々はそれを名前を付けます
current_datetime
。この名前は、より正確にそれが実装する関数を反映することができますので、。 -
このビューは返され
HttpResponse
、生成したレスポンスを含むオブジェクトを。各ビュー機能が戻るための責任があるHttpResponse
オブジェクトを。
Djangoは、システムを通過する要求と応答状態オブジェクトを使用します。
ブラウザがサーバーからページを要求すると、Djangoはリクエストのメタデータが含まれているのHttpRequestオブジェクトを作成します。その後、Djangoは適切なビュー、最初のパラメータとして機能するには、このビューのHttpRequestオブジェクトをロードします。
各ビューはHttpResponseオブジェクトを返すために責任があります。
HttpRequestのオブジェクト
行は、パッケージ本体のHttpRequestクラス属性のコンテンツへの要求パケット、ヘッダ情報を、ジャンゴ。他の特別な指示に加えて、読み取り専用です
リクエストオブジェクトのプロパティ
request.scheme:要求プログラムの代理として、HTTPまたはHTTPS
request.pathは、次のような経路要求は、127.0.0.1/org/listを要求し、その値は、/ ORG /リストであること
request.method:HTTPリクエストメソッドは、GETやPOSTリクエストの使用を示し、
request.encoding:表現提出した符号化データ
request.GET:GETリクエスト
request.POST:ポスト取得要求、例えばユーザパスワードは、遠位端を提出したように、request.POST.getによって得ることができます()
request.COOKIES:クッキーのすべてが含まれています
ますrequest.session:被験者が読みだけでなく、辞書などを書くことができますが、現在のセッションを表します。Djangoがサポートセッションを有効にした場合のみ使用可能です。
request.FILES:すべてアップロードされたファイルの情報が含まれている同様のオブジェクトディクショナリ。各キーファイルの<input type =「ファイル」NAME =「」/>名前、対応するデータと比較された値です。
なお、ファイル、およびのみ送信POSTメソッド要求の<FORM>のenctype =「マルチパート/フォームデータ」の場合、データに含まれます。そうでない場合、FILESは空の辞書ライクオブジェクトになります。また:あなたはPOSTを使用している場合は、ファイルをアップロードし、ファイル情報には、プロパティファイルに含まれます
これは、クッキーのすべてが含まれています
request.user:AUTH_USER_MODEL
ユーザーが現在ログオンしてオブジェクトのタイプ。
ユーザーが現在ログインしていない場合、user
あなたはに設定されますdjango.contrib.auth.models.AnonymousUser
のインスタンス。あなたは()is_authenticatedによってそれらを区別することができます。リクエストはフロントエンドに渡されると、{%request.user.is_authenticated%なら}によってフロントエンドは、ユーザのログイン時刻か否かを判断します
request.META:HTTPのすべてのヘッダーを含む標準のPython辞書。特定のヘッダ情報は、以下のいくつかの例であり、クライアントとサーバーによって異なります。
すべてのHTTPヘッダーを含む標準のPython辞書。特定のヘッダ情報は、以下のいくつかの例であり、クライアントとサーバーによって異なります。
CONTENT_LENGTH
- 要求(文字列)の本体の長さ。CONTENT_TYPE
- MIMEタイプtext要求。HTTP_ACCEPT
- Content-Typeの応答受取。HTTP_ACCEPT_ENCODING
- 応答を受信する符号化されてもよいです。HTTP_ACCEPT_LANGUAGE
- 言語かもしれない応答を受け取ります。HTTP_HOST
- HTTPホストヘッダーは、顧客によって送られました。HTTP_REFERER
- ページを参照。HTTP_USER_AGENT
- ユーザーエージェント文字列クライアント。QUERY_STRING
- クエリ文字列(不解析さ形)の形で単一のストリング。REMOTE_ADDR
- クライアントのIPアドレス。REMOTE_HOST
- クライアントのホスト名。REMOTE_USER
- ユーザ認証サーバの後。REQUEST_METHOD
-文字列、例えば"GET"
、若しくは"POST"
。SERVER_NAME
- サーバーのホスト名。SERVER_PORT
- サーバポート(文字列)
ファイルの例をアップロード
def upload(request):
"""
保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。
但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。
"""
if request.method == "POST":
# 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值
filename = request.FILES["file"].name
# 在项目目录下新建一个文件
with open(filename, "wb") as f:
# 从上传的文件对象中一点一点读
for chunk in request.FILES["file"].chunks():
# 写入本地文件
f.write(chunk)
return HttpResponse("上传OK")
HttpResponseオブジェクト
レスポンスオブジェクトには主に3つの形式があります。
- HttpResponse()
- レンダリング()
- リダイレクト()
HttpResponse()
その応答として、特定の文字列との直接ブラケット。
レンダリング()
render(request, template_name[, context])
参数:
request: 用于生成响应的请求对象。
template_name:要使用的模板的完整名称,可选的参数
context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
アプローチは、レスポンスボディとしてHTMLページにテンプレート構文テンプレートページのレンダリング、最終的なレンダリングをレンダリングすることです。
リダイレクト()
リダイレクトするためにハードコードされたURLを届けます
def my_view(request):
...
return redirect('/index/')
それは完全なURLを指定できます。
def my_view(request):
...
return redirect('http://www.baidu.com/')
JsonResponseオブジェクト
JsonResponseは、JSONエンコードされたレスポンスを生成するように設計のHttpResponseのサブクラスです。
from django.http import JsonResponse
response = JsonResponse({'foo': 'bar'})
print(response.content)
b'{"foo": "bar"}'
あなたは安全なパラメータを設定する必要が非キーワード辞書の種類を渡したい場合は、デフォルトの辞書の種類は、渡すことができます。
response = JsonResponse([1, 2, 3], safe=False)
CBVとFBV
CBVベースビューの機能に基づいてビュー(ファンクションベースビュー)(クラスベースビュー)およびクラス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):
def get(self, request):
return render(request, "add_class.html")
def post(self, request):
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()),