状態の保持
- ブラウザは、サーバーがステートレスで要求します
- ステートレス:ユーザの要求、ブラウザを参照するとき、サーバは、ユーザが以前に行われたかを知ることができない、新しい要求すべての要求です。
- ステートレスな理由:ブラウザとサーバはソケットソケット通信を使用しているが、ブラウザへの復帰後の結果を要求するサーバは、それが現在のソケット接続を閉じ、サーバが終了したページオブジェクトのページを処理した後に破棄されます。
- そのようなユーザーがログインしているかどうかなど、ユーザーのブラウザの状態を抑えることが時々必要性、
- どの商品をブラウズ
- :主に二つの方法で残っている状態を実装し
、クライアントのクッキーに格納された情報を使用①
②情報のセッションを保存するためにサーバーを使用
1.クライアントに格納されたデータが呼び出される:クッキーは、
クッキーが名前ベース(IP)ベースであります
クライアント、およびドメイン名(IP)を交換する際に変更する必要があります
最初の要求手順は、
①任意のブラウザのクッキー情報サーバ最初の要求を運ばない
サーバは、リクエストがクッキー情報を発行されていない要求を受信した後②
サーバクッキーを設定する③、クッキーを応答に設定されている
ブラウザは、応答を受け取る④見つかった応答がクッキー情報を持っていること、これは、クッキー情報にまで保存されます
第二回の工程の後に
、このクッキー情報を運ぶために、第2及び⑤ブラウザの後に何を要求して
、この時間の後に⑥サーバがrequest'll検索要求を受信します実施クッキー情報は、その後、あなたはこれが要求されている知っています
有効期限
max_ageのは:なしデフォルトの秒数を表している
時間+秒数後の時間は、サーバー要求時間から受信される
max_ageの=
クッキーの削除
最初の方法を:削除
response.delete_cookie(キー)
= 0 max_ageのを作るために第二の方法
response.set_cookie(キー、値、max_ageの= 0)
2.サーバー側の呼び出しに格納されたデータ:セッションを
クッキーに依存するセッションの必要性
ますrequest.sessionが辞書で
、ブラウザがクッキーを無効にする場合は、セッションを達成することができません
最初の要求
①クライアントはクッキーが全くありません、サーバーにユーザー名とパスワードを使用してPOSTリクエストを送信し
、サーバがリクエストを受信した後②、ユーザー名とパスワードを認証し、何の問題は、セッション情報に配置することはできないことを確認し
たセッション情報を設定する③同時に、サーバは自動的にレスポンスヘッダセッションIDにCookie情報を設定します
④クライアント側が応答を受信した後、それは、クッキー情報(情報セッションID)が保存されている
第二の後、要求
秒後と⑤要求するセッションID情報を搬送
検証が成功し、検証次に、サーバはこの要求を受信した場合、情報はセッションIDを取る⑥、その情報は、(セッション情報がサーバに格納された)セッションを取得することができます
セッションが保存されてから、クライアント・データである
セッションはクッキーの中に含まれる
第2の要求以降クッキー情報、クッキー情報が含まれ、セッションが存在する
リクエストヘッダにCookie情報を
セッションのセッションを設定する際に二つのことを行うために
、データベースに格納されたデータ1.
クッキーの情報を設定します。2.を、この情報は、セッションIDクッキーがキーです
クラスビューとミドルウェア
Classオブジェクト指向のビューは、アイデアに使用されています
Djangoのクラスは、ビューを定義するために使用することができる、ビュークラスが呼び出されます。
- 定義されたクラスビュー
①は、ビュー(django.viewsからビューをインポート)から継承された
さまざまな方法②要求が異なるビジネスロジック持っている
ような私たちの関数名などのHTTPリクエストメソッド名を使用して直接法のクラスビュー:入れ、GET、POSTを
第2のパラメータの方法③ビュー・クラス・インスタンス・オブジェクトがリクエストでなければならない
戻り返される値とそのサブクラスHttpResopnseを有していなければならないクラスビューの
django.views.genericインポートビューから
RegisterViewクラス(ビュー):
「」「クラスビュー:登録を処理します」「」
def get(self, request):
"""处理GET请求,返回注册页面"""
return render(request, 'register.html')
def post(self, request):
"""处理POST请求,实现注册逻辑"""
return HttpResponse('这里实现注册逻辑')
メリットのクラスビューは
1.良い可読性
残りは、クラスの特定の論理ビューを使用する必要がある場合は、ビュー機能2.クラスビューの相対は、高い再利用性を持っている、あなたは、クラスへの直接の後継を表示することができます
ビューDjangoが提供さから定義クラスは、親ビューを継承する必要が
django.views.genericインポートビューから使用することができる
か、django.views.generic.baseインポートビューからインポート
追加するクラスビューas_view()メソッドを使用して、ルートを設定する場合。
= urlpatterns [
#ビュー機能:登録
#URLを(R&LT '^登録/ Katexパースエラー:期待される' EOF 'GOT' # ':... egister 42位ATは')、#クラスビュー:...登録URL」、意見。 RegisterView.as_view()、名前= '登録')、
]
クラスビューの原則
@classonlymethod
デフas_view(CLS、** initkwargs):
「」 "
要求-応答プロセスの主なエントリポイント。
『』"
...省略代码...
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
# 调用dispatch方法,按照不同请求方式调用不同请求方法
return self.dispatch(request, *args, **kwargs)
...省略代码...
# 返回真正的函数视图
return view
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
多重継承ディスパッチクラスビューをオーバーライドします
クラスセンタービュー(ビュー):
def get(self,request):
return HttpResponse("OK")
def post(self,request):
return HttpResponse("OK")
オブジェクト指向機能を使用して多重継承。
クラスセンタービュー(LoginRequireMixin、ビュー):
def get(self,request):
return HttpResponse("OK")
def post(self,request):
return HttpResponse("OK")
ミドルウェア
軽量、基礎となるプラグインシステムでのDjangoミドルウェアは、入力または出力のDjangoを変更する、Djangoの要求と応答処理を介入することができます。
ミドルウェアはDjangoフレームワークの堅牢性を開発し、強化するために、開発者のための非侵入的な方法を提供するように設計されています。
我々は、処理Djangoのビューの異なる段階で入力または出力を介在するミドルウェアを使用することができます。
1つのミドルウェア定義方法
①植物ミドルウェア機能を定義し、ミドルウェアを呼び出すことができる返します。
②ミドルウェアファクトリ関数はオブジェクトを呼び出すことができGET_RESPONSEを受信する必要があります。
③戻るミドルウェアはまた、ターゲットと呼ばれ、ビューは、要求オブジェクトを受信する必要があると応答オブジェクトを返すと同じであってもよいです。
:DEF simple_middleware(GET_RESPONSE)
のみDjangoの設定と初期化時に初めてここで書かれたコード#を行います。
def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。
return response
return middleware
たとえば、ブックmiddleware.pyアプリケーションで新しいファイルを作成し、
デフmy_middleware(GET_RESPONSE):
プリント( 'INIT被调用')
デフミドルウェア(リクエスト):
プリント( '要求被の调用前')
レスポンス= GET_RESPONSE(リクエスト)
、印刷( '応答後の被调用')
の戻り応答
リターン・ミドルウェア
良いミドルウェアの定義は後settings.pyに必要追加ミドルウェアの登録ファイル
ミドルウェア= [
'django.middleware.security.SecurityMiddleware'、
'django.contrib.sessions.middleware.SessionMiddleware'、
'django.middleware.common.CommonMiddleware'、
#'django.middleware.csrf.CsrfViewMiddleware'、
「django.contrib .auth.middleware.AuthenticationMiddleware」、
'django.contrib.messages.middleware.MessageMiddleware'、
'django.middleware.clickjacking.XFrameOptionsMiddleware'、
'book.middleware.my_middleware'、#添加中间件
]
テスト用のビューを定義します。
ミドルウェアDEF(要求):
印刷(「ビュービューが呼ばれた」)
はHttpResponseを返す(「OK」)
結果
INITが呼び出され
、要求が呼び出される前に、
ビュービューが呼ばれ
REPONSEが呼び出された後、
注意:Djangoはそれらのいくつかのinitミドルウェアが二回と呼ばれるかもしれない、デバッグモードで実行されています。
中間体2の複数の実行順序
1. 在请求视图被处理前,中间件由上至下依次执行
2. 在请求视图被处理后,中间件由下至上依次执行
例:
2つのミドルウェアを定義します
デフmy_middleware(GET_RESPONSE):
プリント( 'INIT被调用')
デフミドルウェア(リクエスト):
プリント( '要求被の调用前')
レスポンス= GET_RESPONSE(リクエスト)
、印刷( '応答後の被调用')
の戻り応答
リターン・ミドルウェア
DEF my_middleware2(GET_RESPONSE):
プリント( 'INIT2被调用')
DEFミドルウェア(リクエスト):
プリント( '要求2被前调用')
応答= GET_RESPONSE(リクエスト)
プリント( '応答後2被调用')
リターン応答
リターンミドルウェア
2つのミドルウェアを登録して追加
ミドルウェア= [
'django.middleware.security.SecurityMiddleware'、
'django.contrib.sessions.middleware.SessionMiddleware'、
'django.middleware.common.CommonMiddleware'、
#'django.middleware.csrf.CsrfViewMiddleware'、
「django.contrib .auth.middleware.AuthenticationMiddleware」、
'django.contrib.messages.middleware.MessageMiddleware'、
'django.middleware.clickjacking.XFrameOptionsMiddleware'、
'users.middleware.my_middleware'、#添加
'users.middleware.my_middleware2'、#添加
]
結果
INIT2が呼び出される
のinitが呼ばれた
要求が呼び出される前に
、要求2が呼び出される前に、
ビュービューが呼び出される
応答2が呼び出された後
、応答が呼び出された後、