ジャンゴクッキー&セッション


クッキーとは何ですか

HTTPプロトコルはステートレスなので、あること、サーバーはユーザーの最後のアクションが行われているものであるかを知りません。これは、に深刻な障害となる交互式WEB应用程序実装。メモリクッキー、ハードクッキー:クッキーはクライアントのユーザに情報の一部を保存するには、HTTPの追加的な手段である、ユーザーの最後に保存されたクッキーは、通常2つのタイプに分け、ユーザーのブラウザによって維持しました。クッキーは、httpリクエストに連行され、一般的に4キロバイトの大きさ程度に制限され

クッキーの上に応答の設定でサーバーを追加した後、Cookieサポートブラウザは、要求を行うユーザーは、ブラウザのcookieが現在の故障かどうかを判断するには、次回、このクッキー、(expirse)を保存するためにいくつかの方法で、に応答します、一致するパス(経路)は、一致するドメイン(ドメイン)および他の操作は、このクッキーは、サーバに送信されたリクエストのヘッダに追加されます。それを処理するサーバー

ジャンゴでクッキーを使用します

  • 保存したユーザのログイン状態を実装
# views.py
def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        u = request.POST.get("username", None)
        p = request.POST.get("password", None)
        dic = user_info.get(u)
        print(dic)
        if not dic:
            return render(request, 'login.html')
        elif dic.get('pwd') == p:
           # 密码正确后设定cookie
            response = redirect('/index/')
            response.set_cookie("username", u)
            return response
        else:
            return render(request, 'login.html')
    else:
        return render(request, 'login.html')

#index
def index(request):
    ck = request.COOKIES.get("username")  # 早cookie中获取当前登录的用户
    if not ck:
         return redirect('/login/')
    return render(request, 'index.html', {'current_user': ck})

ユーザー名とパスワードの認証が成功すると、復帰のredirect設定cookieユーザーアクセスインデックスが必要とされていない次回ログインしたときに、この単純な例では、ユーザーのログイン状態の保存時間を実現することができました

  • いくつかの他のクッキーの設定:

1. request.COOKIESユーザデータは辞書として、あなたが取得するために使用を得ることができ、COOKIEをもたらすに送られた
2 response.set_cookie("字典的key",'字典的值')、パラメータなしでバック回ブラウザがクッキーの失敗に閉じているときにのみ設定することができます
。3. response.set_cookie("username",'value',max_age=10)何秒後に期限切れのクッキー
4.有効期限は日時によって設定されています

current_date = datetime.datetime.utcnow()
current_date = current_date+ datetime.timedelta(seconds=10)   # 当前时间加上10s后
response.set_cookie("username", u, expires=current_date)  # 设定到哪个时间点后失效,如果时间设置与当前时间相同,那么就是清除这个cookie

5.設定されたCookieパスの影響

response.set_cookie("username", u,path='/index/')  # 设置这个cookie只在当前url生效,例如设定一个cookie为当前页面显示多少条数据,别的页面就不会被干扰

6. domain=''現在の設定クッキー名
7. secure = False送信HTTPSように配置されたクッキー
8 httponly = Trueのみ取得されていないAクッキーHTTP送信、JSとして提供されます。JSの使用document.cookieすべての買収は、クッキーは、クッキーは、jQueryのを使用して操作することができますすることができます

の塩と9.クッキー

# 设定加盐
COOKIE_SALT = "随机字符串"
response.set_signed_cookie('username', u, salt=COOKIE_SALT)

# 加盐获取
ck = request.get_singed_cookie("username",salt=COOKIE_SALT)

セッション

セッションとは何ですか

参考:自分のお金のジン兄

セッションは、一般的にセッションに翻訳され、セッションは、異なる視点から異なる意味を見に来ました:

  1. ユーザの視点から見ると、彼は会話に参照することができ、ウェブサイト、およびブラウザ、ログイン、ショッピング、他の一連の操作を、開きました
  2. 我々はデータを保持するために特別なデータ構造を必要とするので、慎重に起因するHTTPステートレスに地面からそれを分析するには、ユーザーが自分のログイン状態を保存するために我々のニーズにログオンし、ショッピングカート内のすべての現在の製品は、保存する必要があります。このことは、セッションと呼ばれています

HTTPセッションプロトコルは、HTTPやプログラムを強化するためのデータ記憶構造に基づいているので、サーバーのセッションに保存されています。サーバー・セッションの作成に一般的なステップ:グローバル一意識別子の生成sessionid、対応するデータにオープンスペースを、そして、セッションクライアントにグローバル一意識別子を送信します。各セッションのサーバは、データセッション情報を保持し、クライアントとサーバがアクセスセッション情報データにグローバルに一意の識別子に依存します。

だから、クライアントとサーバーは、この識別子にそれを送信する方法?一般的に、達成するための2つの方法があります。

  • クッキー、道を設定することにより、クッキーサーバは、クライアントに送信されますセッションID
  • URL書き換えは、セッション識別子を一緒に取得するために、すべての帰りのページURL内のすべてのユーザによって要求されたページに次の操作でユーザーを返す前に、これはこれを維持するためにセッションを有効にする、識別子を追加しますユーザーを無効にクッキーが効果的な方法を作っているとき、

セッションクッキーとの比較

  1. シナリオ
  • Cookieの典型的なアプリケーションシナリオは適切に転送され、ユーザーは試合が再び、アカウント情報がサーバーに送信されるというURLを要求した場合、パスワードを覚えている私の操作、クライアントに保存されたクッキーの形でユーザーのアカウント情報を覚えておくことですプログラムは自動的にログや他の機能を完了しています。もちろん、あなたがそうで、このようなページレイアウトなどのクライアント情報の一部を、保存し、履歴を検索し、することができます。
  • サイト上でユーザーがログイン後にセッションの典型的なアプリケーション・シナリオでは、セッションへのログイン情報は、利用者が正当なものであることを保証するために、各リクエストの後に適切なログイン情報を確認してください。もちろん、まだショッピングカートを持っている、などの古典的なシーン。
  1. セキュリティ
  • 暗号化されていない、それはいくつかの個人情報を公開するならば、クライアントに保存されたクッキー情報、貧しいセキュリティは、通常の状況下では、後の機密情報をクッキーで暗号化されているが、それは簡単にメモリを盗まれる可能性があります。
  • ファイルまたはデータベースに保存されている場合は、情報セッションは、サーバーに保存され、そこに盗まれる可能性が高いですが、クッキーよりもはるかに小さいの可能性。ここでは、セキュリティに関連するハードウェアがあるが、一般的にセキュリティセッションクッキーよりも高くなっています。
  1. 演奏
  • セッションがサーバーに保存されている間にクッキーがクライアントに格納され、クライアントの消費量は、サーバーリソースを消費して、I / Oとメモリです。
  • サーバセッションによって生じる圧力が、十分に分散し、濃縮し、リソースのクッキーの消費量は、この時点で、セッションクッキーは、優れています。
  1. 即時性
  • クッキーは、長い時間、それの妥当性を設定することにより、クライアントに存在することができ、
  • (ユーザが積極的に近いブラウザセッションを破壊したりした後にトリガタイムアウト)セッション、一般に比較的短い期間。
  1. その他の
    処理クッキーは、開発の容易なセッションではありません。そして、クライアント側のクッキーに数とサイズ、およびセッションのサイズを制限することであるが、唯一のハードウェアの制限のために、データは間違いなく大きすぎて保存することができます。

使用されるセッションジャンゴ

注意:

  1. ジャンゴデフォルトdjango.contrib.sessions.models.Sessionモジュール、データベース内のセッションストレージdjango_sessionテーブルには、当然のことながら、これらは設定可能です

  2. 使用する必要があるdatabase-backed sessions前に、特定のセットを、そして間セッションデータベースフィールドに格納されたテーブルを生成します
python manage.py makemigrations
python manage.py migrate
  • 単純な実装
# views.py
def login(request):
    if request.method == "GET":
        return render(request, "login.html")

    if request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        rmb = request.POST.get('rmb',None)
        print(rmb)
        if user == 'root' and pwd == "123":
            # 直接设定值
            request.session['username'] = user
            request.session['is_login'] = True
            if rmb == "10":
                request.session.set_expiry(10)  # 设置多少秒后过期
            # 生成的session默认存储在django的默认数据库中
            return redirect('/index/')
        else:
            return render(request, "login.html")

def logout(request):
    # 注销
    if request.method == 'POST':
        print(request.session.get('username'))
        request.session.delete(request.session.session_key) # 从数据库中删除
        print(request.session.session_key)
        print(request.session.get('username'))
        return redirect('/login/')

def index(request):
    if request.session.get('is_login'):
        return render(request, 'index.html')
    else:
        return HttpResponse("Fuck off")
  • アクセスは、このようなアプリケーションでは、データベース内の次のデータが生成されます。

セッションテーブル

  • その他の操作
1. 获取session中的值
request.session['k1']
request.session.get('k1',None)
2. 设定session中的值
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
3. 删除session对应的值
del request.session['k1']
4. 由于session的真是数据结构其实是个字典对象,所以拥有字典的一些方法:
request.session.keys() # 所有的key
request.session.values() # 所有的value
request.session.items() # 键值对元组
# 其他方法
request.session.iterkeys() # key的可迭代对象
request.session.itervalues() # value的可迭代对象
request.session.iteritems()  # 键值对元组的可迭代对象
5. 用户的全局唯一sessionid
request.session.session_key
6. 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
7. 判断是否存在
request.session.exists("session_key")
8. 删除这个sessionid,并也会删除其对应的数据
request.session.delete("session_key")
9. 过期设定
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。(默认是两个周)
  • 構成関連

エンジン1関連
次以外のDjangoエンジンがセッションRedisのストレージとして使用することができるサポートされている、参照メソッドがRedisの提供することができることに加えMengchuoを

# 数据库存储
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# 缓存存储
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# 文件存储
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'

2.共通設定

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,默认修改之后才保存

おすすめ

転載: www.cnblogs.com/forsaken627/p/12521965.html