、Djangoのセッションクッキーと
セッション
会话可以理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。
在一个会话的多个请求中,需要共享数据,就是会话跟踪技术。比如你在登陆银行主页,请求登录、请求取款、请求转账、请求还款...,在这个会话中,当前的用户信息必须在这个会话中是共享的,因为登录的是你,那么取款转账时一定是相对你的取款转账 。这就说明我们必须在一个会话过程中有共享数据的能力。
在web中这种能力的实现就要依靠cookie和session
二、クッキー
クッキーの起源
HTTPプロトコルはステートレスです。その実行と以前の要求と後続の要求の結果は直接関係ないが、独立している各要求、それは直接影響し、上記要求応答によって制限されないが、直接後者の要求の応答に影響を及ぼしません。
クライアントとサーバーのデータが与えられたセッションで生成され、何の状態は、これらのデータは保持されないことを考えていないしていること。生成されたセッションデータはクッキーを使用する必要があるので、我々は、それが「ホールド」することで、保存する必要があります
ジャンゴでは、もののには、多くのページを書きましたが、ログインできないユーザーは、すべてのページを見ることができる、唯一のライン上のURLを知っておく必要がありますが、安全のためのメカニズムに関係なく、ユーザーの身元を確認する必要があるURLアクセスの、検証する必要があります。ときに、ユーザ状態がログオンする必要があるかどうかを確認するために、およびログオンを繰り返す必要はありませんが、HTTPはステートレスで、ログインした後、あなたはクッキーを使用する必要があります。
クッキーとは何ですか
クッキーは、ブラウザ技術で、クッキーは、具体的に言及、それはサーバーの小さな情報でありました、ブラウザ上に格納された鍵の束を送信し、クライアントへのサーバー小さなデザート、サーバーの次の訪問として理解することができますときブラウザが自動的に有用な情報を抽出するために、サーバのためにこれらのキーと値のペアを運ぶでしょう。
クッキーの原則
仕組み:ブラウザが空のクッキーで、サーバーにアクセスし、サーバーからコンテンツを生成するために、ブラウザはローカルに保存された対応を受け、ときに、ブラウザの訪問、自動的にクッキーをもたらすブラウザため、サーバークッキーの内容により、「誰」であったかを決定します。
次のページのクッキーを見ます
- クッキーの仕様
- クッキーのサイズが4KBの限界です。
- クライアントブラウザ上のクッキー20まで保存サーバー。
ブラウザが複数のサーバにアクセスすることができますので、ブラウザは、300クッキーまで保存します。
随着互联网技术发展,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等。
注意:異なるブラウザ間でのCookieの共有されていません。これは、サーバーにアクセスするためにIEを使用する場合、サーバはIEのCookieを送信し、その後は、Google Chromeを使用する場合、サーバーへのアクセスまでIEを保存で、IEがサーバーに保存されたクッキーを送信することはできません。
- クッキーの配信
HTTPリクエストとレスポンスヘッダ転送クライアントとサーバを経由してクッキー
- クッキー:クライアントからサーバに送られたリクエスト・ヘッダー。
- クッキー:= A; B = B; C = C. 即ち、離れたクッキーセミコロン複数から。
- Set-Cookieを:レスポンスのヘッダー、サーバーがクライアントに送信します。
- セット - クッキー:クッキーのSet-CookieオブジェクトA = AのSet-Cookie:B = BのSet-Cookie:C = C
ユーザー - ブラウザ - サーバー
BS:統一されたインタフェース、ブラウザ、URLを入力し、あなたがウェブサイトを開くことができます
クッキーカバレッジ
もし、サーバ、その後送信クッキーが古いクッキーが上書きされます繰り返し、例えば、サーバから送信された最初のクライアント要求はクッキーです:のSet-Cookie:A = A; 2番目の要求はサーバによって送信されます。Set-Cookieの: A = AA、クライアント、去るのみクッキー、すなわち:A = AA。
三、Djangoのクッキーの操作
ページキャッシュとクッキーをクリアするには、Ctrl + Shiftキー+デル3つのキー
クッキーの取得
request.COOKIE [ 'キー']#或者request.COOKIE.get( 'キー')
request.get_signed_cookie(キー、デフォルト= RAISE_ERROR、塩= ''、max_ageの=なし)
パラメータ:
デフォルト:デフォルト
塩:塩暗号化
max_ageの:バックグラウンドコントロールの有効期限設定されたCookie
担当者=のHttpResponse(...)#或担当者=レンダリング(リクエスト、...)
rep.set_cookie(キー、値、...)
の戻り担当者rep.set_signed_cookie(キー、値、塩= 「 暗号化された塩」、max_ageの=なし、...)
パラメータ:
キー、キー
値=「」、値の
データ秒でmax_ageの=なし、タイムアウト(、この時間が経過した後)
=なし、タイムアウト(1時間のデータの日付形式にその時は自動的に無効)有効期限
パス=「/」、パスクッキーの力を、/特別なルートパスを示しています。クッキーのルートパスページは、任意のURLにアクセスすることができます
力にドメイン=なし、クッキーがドメインを
安全な= Falseに、httpsを伝送
HttpOnlyの= FalseのHTTPプロトコルのみの伝送、JavaScriptが取得できない(絶対的ではなく、覆われていてもよいキャプチャの底に取得することができます)クッキーを削除します。
ジンバブエログアウトDEF(要求):
REP =リダイレクト(「/ログイン/」)
rep.delete_cookie(「ユーザー」)は、#がする前に、ユーザーのブラウザに設定さusercookie値を削除する
担当者を返しますクッキー認証
たとえば、私たちは自分でクッキーを設定したい、鍵K1で、値がV1である:
DEF指数(要求):
RET =のHttpResponse(「OK」)
ret.set_cookie(「K1」、「V1」)
リターンRETの
結果ページのサイド開発クッキーツール見える、設定成功:
値V1を、対応するクッキーキーk1がある場合は、私たち自身のクッキーの値セットのコントラストによって、あなたが作るためにホームページを訪問することができ
home.htmlを:
これは、ホームページです
def home(request): is_login = request.COOKIES.get('k1') if is_login == 'v1': return render(request,'home.html') else: return HttpResponse('gun')
質問が発生:直接アクセス127.0.0.1:8000/homeがあり、我々はページの最後にクッキーを見たときにも直接、ホームページを取得するには、我々はまだキャッシュメカニズムので、我々は、Ctrlキー+ Shiftキーを必要とする、V1に対応するK1を持っていますページキャッシュとクッキーをクリアする+デルの3つのキー
キーk1に対応するクッキー値がV1ではないがあるので、あなたはホームページを取得します。この時間は直接ホームページにアクセス、
対処する:あなたは、インデックスビュー機能によりインデックスパスにアクセスする必要があります、クッキー値のペアk1を設定するには:V1を、その後、ブラウザをホームページをご覧いただくか、地元のクッキーで、あなたはホームページを取得することができますログイン検証
要件:3ページ、ログイン、インデックスページ、ホームページを作り、ユーザーがインデックスとホームページにアクセスするには、最初のページにログインしなければなりません
パスを設定し
django.conf.urlsインポートURLから
app01インポートビューからurlpatterns = [ url(r'^index/', views.index,name='index'), url(r'^home/', views.home,name='home'), url(r'^login/', views.login,name='login'), ]
3ページの作成
home.htmlを:
これは、ホームページがある
インデックスページに行きます
index.html: <body> 来到了index的页面 <a href="/home/">返回home页面</a> </body> login.html: 欢迎来到登陆的页面 <form action="/login/" method="post"> {% csrf_token %} 用户名:<input type="text" name="uname"> 密码:<input type="password" name="pwd"> <input type="submit"> </form>
ビュー機能を書く
django.shortcutsインポートからレンダリング、HttpResponseに、リダイレクトdef login(request): if request.method == 'GET': return render(request,'login.html') else: username = request.POST.get('uname') password = request.POST.get('pwd') if username == 'yangzm' and password == '123': ret = redirect('home') ret.set_cookie('is_login',True) return ret else: return redirect('login') def index(request): is_login = request.COOKIES.get('is_login') # print(is_login,type(is_login)) # True <class 'str'> if is_login == 'True': return render(request,'index.html') else: return redirect('login') def home(request): is_login = request.COOKIES.get('is_login') if is_login == 'True': return render(request,'home.html') else: return redirect('login')
ログイン機能では、ログイン画面に戻り、その後、ユーザーが投稿した検証を決定するためにデータを取得するためにクッキーの値を設定することに成功したか、あるいは再度ログインするためのログインページを返す
インデックスで、家庭機能、価値判断のクッキーの設定、認証が成功しましたページに戻るか、ログインページに戻ってリダイレクトしますバージョン改善されたビュー機能-プラスデコレータを
django.shortcutsからは、レンダリングのHttpResponse、リダイレクトインポートdef logining(f): def inner(request,*args,**kwargs): is_login = request.COOKIES.get('is_login') if is_login == 'True': ret = f(request,*args,**kwargs) return ret else: return redirect('login') return inner def login(request): if request.method == 'GET': return render(request,'login.html') else: username = request.POST.get('uname') password = request.POST.get('pwd') if username == 'yangzm' and password == '123': ret = redirect('home') ret.set_cookie('is_login',True) # ret.set_cookie('is_login',True,10) 设置超时函数10s,超过10scookie就失效了 return ret else: return redirect('login') @logining def index(request): return render(request,'index.html') @logining def home(request): return render(request,'home.html')
四、セッション
session是服务端技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。
Cookie虽然在一定程度上解决了 “保持状态” 的需求,但是cookie最大支持4096字节,而且cookie保存在客户端,可能别拦截或者盗取
比如我设置了三组的cookie值,都会在网页看得到:
session就解决了以上问题,即支持更多的字节,并且保存在服务端,有较高的安全性
给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等
五、Djangoの操作セッション
一个用户拿到session_id,只要没清除cookie,就还会有session_id,就不会生成一条新纪录了;
清除了cookie,session_id也没有了,此时再来访问就会新生成一条新的数据
一个用户 -- 一个浏览器 -- 对应一个session记录
[設定]
ますrequest.session [ 'K1'] = 123なる
request.session.setdefault( 'K1'、123)が設定されていないこと位に存在します自動的にランダムな文字列、およびランダムユーザデータの文字列(暗号化)が保存され、内部テーブルセッションDjangoのための有効期限は、このランダムな文字列のセッションIDを助ける生成:背中にクッキーのランダムな文字列の形で内部に追加ブラウザ(セッションID名を変更することができます)
しかし、あなたのmodels.pyは何の対応は、この間がないので事、ジャンゴ・セッションこの表は、あなたが直接、ORMを制御することはできませんのでご注意
値
ますrequest.session [ 'K1']
request.session.get( 'K1'、なし)request.session这句是帮你从cookie里面将sessionid的值取出来,将django-session表里面的对应sessionid的值的那条记录中的session-data字段的数据给你拿出来(并解密),get方法就取出k1这个键对应的值
删除值
del request.session['k1'] # django-session表里面同步删除
登录验证
def home(request):
# is_login = request.session['is_login'] # 这么取值,找不到is_login这个键就会报错
is_login = request.session.get('is_login')# 这样取值不会报错
# print(is_login,type(is_login)) # True <class 'bool'>
'''
1.从cookie里面拿出了session_id:xxx这个随机字符串
2.去django-session表里面查询对应的数据
3.反解加密的用户数据,并获取用户需要的数据
'''
if is_login == True:return render(request,'home.html') else: return redirect('login')
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
username = request.POST.get('uname')
password = request.POST.get('pwd')
if username == 'yangzm' and password == '123':
request.session['is_login'] = True
request.session['username'] = 'yang'
# 1.生成了session_id:随机字符串dsdggdf
# 2.在cookie里面加上了一个键值对session_id:dsdggdf
# 3.将用户的数据进行了加密,并保存到django-session表里面
'''
session_key session_data
dsdggdf 用户数据加密后的字符串
'''
return redirect('home')
else:
return redirect('login')
加入退出功能:
url(r'^logout/', views.logout,name='logout'),
home.html:
<div>
<a href="/logout/">退出</a>
</div>
def logout(request):
request.session.flush()
return redirect('login')
其他方法
所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()会话session的key
session_key = request.session.session_key 获取sessionid的值
将所有Session失效日期小于当前日期的数据删除,将过期的删除
request.session.clear_expired()
检查会话session的key在数据库中是否存在
request.session.exists("session_key") #session_key就是那个sessionid的值
删除当前会话的所有Session数据
request.session.delete()
删除当前的会话数据并删除会话的Cookie。
request.session.flush() #常用,清空所有cookie---删除session表里的这个会话的记录,
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout() 函数中就会调用它。设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。改session_id
在settings里面设置:
SESSION_COOKIE_NAME = 'niubi'
然后在网页查看cookie:
Django中的Session配置
数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎加密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,默认修改之后才保存(默认)