まず、セッショントラッキング技術
1.1セッショントラッキングとは何ですか
私たちは、会話が何であるかを見てする必要があります!会話は、複数の要求と応答を含むことができ、会議中に、クライアントとサーバの間の会合として理解することができます。サーバは10086人のサービス担当者である一方、たとえば、あなたは10086に電話をかけ、あなたは、クライアントです。瞬間から双方が電話を接続するため、セッションが電話を切るするか、始まったセッションの終わりを示します。通話中に、あなたは、単一のセッションでそのように複数の要求、10086に複数の要求を行うことができます。
顧客の終わりには、ブラウザセッションを閉じまで、ウェブでは、最初のクライアントは、セッションが始まっ開始するためにサーバに要求を送信します。
セッショントラッキング技術であるセッション要求内の共有データの複数。次のように一つの例では、セッション要求は次のとおりです。ホームバンキング要求。
- リクエスト着陸(リクエストパラメータには、ユーザー名とパスワードです)
- 転送要求(転送要求パラメータデータに関連します)
- リクエストクレジットカード決済(データの返済に関連するリクエストパラメータ)
現在のユーザー情報のこの最後のセッションでログインがジョー・スミスであるので、このセッションで共有されなければならない、ジョー・スミスは、それは転送と返済の時に比較的転送や支払いでなければなりません!これは、私たちがセッションでデータを共有する機能を持っている必要があることを示しています。
1.2クッキーセッションパス技術の使用またはセッション終了
私たちは、HTTPプロトコルは、各要求が独立していることを意味するステートレスなプロトコルであることを知っています!要求前の状態を記録することができません。しかし、HTTPプロトコルには、クッキーのセッショントラッキングを完了するために使用することができます!Web開発、セッショントラッキング、依存基礎となるセッションクッキー技術への完全なセッション。
二、クッキーのご紹介
クッキーの起源。
我々は、すべてのHTTPプロトコルはステートレスであることを知っています。
ステートレスは、直接バックに影響を及ぼさない、それは直接応答に影響を与える、前述の要求によって限定されるものではなく、各要求は、その実行と以前の要求と後続の要求の結果は直接関係しない、独立であることを意味します要求応答状況。
人生を記述するために、興味深い言葉だけでストライキとして、サーバーのため、各要求が新規です。
状態データは、特定のセッションで作成したクライアントとサーバとして理解することができ、そして何の状態は、これらのデータは保持されないことを考えていないしていること。生成されたセッションデータは、我々は保存する必要があり、それはにある「ホールド。」だから、クッキーは、このようなシナリオの下に生まれています。
2.1クッキーとは何ですか
実際には、クッキーは、Pythonで辞書と同様、キーと値の構造です。サーバの応答をクライアントのブラウザに送信されます。そして、クライアントのブラウザは、サーバーと、サーバーに送信されたクッキーにアクセスするために再びクッキー、次の時間を節約します。クッキーはサーバーによって作成され、その後、鍵のペアに対応することで、クライアントに送信されます。クライアントは、クッキーが保存され、およびクッキー(クッキーサーバ)のソースをマークします。クライアントは、サーバがクライアントを識別することができるように、サーバーへのリクエストに含まれるすべてのサーバーのクッキーを送信するサーバに要求を行うと!
2.2クッキーの原則
サーバから生成されたコンテンツは、ブラウザがローカルに保存された要求を受け取る;ときに、ブラウザの訪問サーバーは、このクッキーの内容によって判断することができますので、ブラウザが自動的に、クッキーをもたらす「誰:クッキーがある作品「。
2.3クッキーの仕様
- クッキーのサイズが4KBの限界です。
- クライアントブラウザ上のクッキー20まで保存サーバー。
- 300クッキーまで保存ブラウザ。
上記のデータは、HTTPのみクッキー仕様ですが、今日のブラウザ戦争では、ブラウザのいくつかの対戦相手を倒すためには、自分の能力の理由を実証するために、あなたは、このような各クッキーの大きさとして、いくつかの「拡張」のクッキー仕様は8キロバイトであるかもしれませんあなたは500クッキーなどまで保存することができます!しかし、それはあなたのハードドライブが表示されません埋めること!
なお、異なるブラウザはクッキーの共有されていません。これは、サーバーにアクセスするためにIEを使用する場合、サーバはIEのCookieが送信されます、そしてあなたは、Firefox、IEを使用してサーバがサーバに保存されたクッキーを送信することはできませんアクセスしたときにアップIEを保存しています。
2.4クッキーカバレッジ
もし、サーバ、その後送信クッキーが古いクッキーが上書きされます繰り返し、例えば、サーバから送信された最初のクライアント要求はクッキーです:のSet-Cookie:A = A; 2番目の要求はサーバによって送信されます。Set-Cookieの: A = AA、クライアント、去るのみクッキー、すなわち:A = AA。
お使いのブラウザで2.5チェッククッキー
三、Djangoの操作クッキー
3.1取得クッキー
request.COOKIES [ ' キー' ] request.get_signed_cookie(キー、デフォルト = RAISE_ERROR、塩= ''、max_ageの=なし)
パラメータ:
- デフォルト:デフォルト値
- 塩:塩暗号化
- max_ageの:バックグラウンドコントロールの有効期限
3.2設定されたCookie
担当者= のHttpResponse(...) 議員=レンダリング(リクエスト、...) rep.set_cookie(キー、値) rep.set_signed_cookie(キー、値、塩 = ' 加密盐')
パラメータ:
- キー、キー
- 値=「」の値
- max_ageの=なし、クッキーのタイムアウトパラメータが\ None``の場合には時間(秒)を延長する必要がブラウザを閉じるまで、クッキーはしていきます
- =いずれも有効期限が切れていない、超时时间(IEはまだされていない場合ので、それを設定し、満了が必要です。)
- 力のクッキーパスに入力したパス=「/」、/ルートパスを表し、特別:クッキーのルートパスは、ページの任意のURLにアクセスすることができ、ブラウザだけ避けるために、パスバックページにクッキーを渡します他のアプリケーションサイトのクッキーが通過します。
- ドメインdomain =なし、クッキーはあなたがクロスサイトのCookieを構築するために、このパラメータを使用することができます有効になりません。「Example.com」これらのサイト上に構築など、ドメイン=クッキーが読める以下の通りである:www.example.com、www2.example.comとan.other.sub.domain.example.com。このパラメータをNoneに設定されている場合は、クッキーだけでそのサイトを設定することで読み取ることができます
- 安全な= Falseのは、ブラウザのクッキーは、HTTPSを介して前後に渡されます。
- HTTPのみ= FalseのHTTPプロトコルのみ輸送、JavaScriptが取得できない(絶対的ではないが、キャプチャの底に取得することができます覆われていてもよいです)
3.3クッキーを削除
DEF ジンバブエログアウト(要求): REP =リダイレクト(「/ログイン/ 」) rep.delete_cookie(「ユーザー」) #はする前に、ユーザーのブラウザに設定さusercookie値を削除 返す REPを
バージョン3.4クッキーチェックでログイン
デフlogin_auth(FUNC): デフインナー(要求、* argsを、** kwargsから): next_url = request.get_full_path() の場合 request.COOKIES.get(' is_login ' ): リターン FUNC(要求、* argsを、** kwargsから) 他: リターンリダイレクト(' ?cookie_login /次=%sの'%next_url) を返すインナー @login_authの デフcookie_order(要求): 返すのHttpResponseを(' 我是订单页面' ) @login_auth DEF cookie_index(リクエスト): 名前 = request.COOKIES.get(' ユーザ名は' ) を返す(リクエスト、レンダリング' cookie_index.html ' { ' 名前' :名}) DEF cookie_login(要求): もし request.method = = ' POST ' : next_url = request.GET.get(' 次' ) 名 = request.POST.get(' 名前' ) パスワード = request.POST.get("パスワード ' ) であれば名前== ' lqz ' とパスワード== ' 123 ' : インポート日時 になりました。= datetime.datetime.now()はstrftime(' %Y-%M-%D%X " ) プリント(今) OBJ = リダイレクト(next_url) obj.set_cookie(' is_login ' 、TRUE) obj.set_cookie(' ユーザ名' 、名前) obj.set_cookie(「login_time '今) リターンOBJの リターンは、(リクエストをレンダリング' cookie_login.htmlを")
四、セッション
4.1セッションの起源
クッキーがある程度解決しますが、要件を「ホールド」が、4096バイトの最大サポート自体クッキー、クッキーやクライアント自体に保存されているため、傍受または盗難することができるため、したがって、何か新しいものが必要とされて、それをより多くのバイトをサポートする、と彼は、サーバー上に保存され、高いセキュリティがあります。これはセッションです。
質問は「誰が。」サーバは、訪問者を知らない、ステートレスなHTTPプロトコルの特性に基づいて、あります そして、前述したクッキーは、ブリッジの役割を果たします。
私たちは、ユーザーがクッキーでアクセスするように、サーバは人々に知っている、割り当てられた固有のIDを各クライアントのクッキーを与えることができます「」その後、我々、このような「アカウントのパスワード」など、いくつかの時間のためにサーバーに保存されているクッキーの、プライベートな情報に基づいて異なるID、というように。
結論:クッキーまでステートレス不足HTTPのために、サーバは「」人々に知らせて、テキスト形式のクッキーは、ローカルに保存されているが、彼らのセキュリティが貧弱であり、私たちは別のクッキーを介してユーザを識別することができ、セッションで4096バイトより個人情報及びテキストの保存に対応します。
さらに、上記の事実は、クッキーとセッション共通のものは、ない言語やフレームに制限されています。
セッションでは五、ジャンゴ関連するメソッド
# 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 会话session的key request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查会话session的key在数据库中是否存在 request.session.exists("session_key") # 删除当前会话的所有Session数据(只删数据库) request.session.delete() # 删除当前的会话数据并删除会话的Cookie(数据库和cookie都删)。 request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。 # 设置会话Session和Cookie的超时时间 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
Django中使用session时,做的事:
# 生成随机字符串 # 写浏览器cookie -> session_id: 随机字符串 # 写到服务端session: # { # "随机字符串": {'user':'alex'} # }
六、Django中的Session配置
1. 数据库Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 2. 缓存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用设置项: SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
七、CBV中加装饰器
from django import views from django.utils.decorators import method_decorator # @method_decorator(login_auth,name='get') # @method_decorator(login_auth,name='post') class UserList(views.View): # @method_decorator(login_auth) def dispatch(self, request, *args, **kwargs): obj=super().dispatch(request, *args, **kwargs) return obj @method_decorator(login_auth) def get(self,request): return HttpResponse('我是用户列表') def post(self,request): return HttpResponse('我是用户列表')