ジャンゴ:クッキー和セッション

クッキーの起源

  • HTTPプロトコルはステートレスであります
  • ステートレスは、直接バックに影響を及ぼさない、それは直接応答に影響を与える、前述の要求によって限定されるものではなく、各要求は、その実行と以前の要求と後続の要求の結果は直接関係しない、独立であることを意味します要求応答状況。
  • 状態データは、特定のセッションで作成したクライアントとサーバとして理解することができ、そして何の状態は、これらのデータは保持されないことを考えていないしていること。生成されたセッションデータがあることが、私たちは保存する必要がある「ホールド」。だから、クッキーは、このようなシナリオの下に生まれています。

クッキーとは何ですか

  • クッキーは、具体的に参照すると、サーバーに保存されている小型の情報は、ブラウザの送出したキーと値のペアの束、サーバーブラウザが自動的に有用な情報を抽出するために、サーバのためにこれらのキーと値のペアを運ぶアクセス次回。
  • 作品クッキーです:サーバーから生成されたコンテンツは、ブラウザがローカルに保存されたリクエストを受信する。サーバは、このクッキー「の内容によって判断できるように、ブラウザの訪問は、ブラウザが自動的に、クッキーを持って来るとき誰「A。

ビュークッキー

  • Chromeブラウザ、開発者の攻撃ビューを開きます

アプリケーション:

  • ログイン
  • 保存ブラウジング習慣
  • シンプル投票

Djangoはクッキーを操作します

  • 設定/取得クッキー

    #第一种方法普通获取/设置:
    #set_cookie         设置
    class Login(View):
        def get(self,request):
            pass
        def post(slef.request):
            #获取重定向对象
          ret = redirect(url)
             ret.set_cookie("login","1")#设置cookie为{"login":"1"}
             ...
    
    #request.COOKIES.get(键)       获取
    def login_required(func):#login_required函数是装饰器函数
        def inner(request,*args,**kwargs):
            login = request.COOKIES.get("login")
            print(login)
            url = request.path_info
            if login != "1":
                return redirect("/login/?return_url={}".format(url))
            ret = func(request,*args,**kwargs)
            return ret
        return inner
    
    @login_required
    def foo(request):...
    
    #第二种方法加密获取:
    #设置
    rep.set_signed_cookie(key,value,salt='加密盐',...)
    参数:
      key  键
        value  值
        max_age = None 超时时间
        expires = None 超时时间(IE浏览器使用)
        path = "/"   Cookie生效的路径
        domain = None   Cookie生效的域名
        secure = False   HTTPS传输
        httponly = False  只能http协议传输,无法被JavaScript获取(但不是绝对,底层抓包可以获取到也可以被覆盖)
    
    #获取
    request.get_signed_cookie('key', default="", salt='', max_age=None)
    参数:
      key    键
        value  值
        max_age   后台控制过期时间
    
    
    ret.set_signed_cookie("login", "1", salt="yan")
            login = request.get_signed_cookie("login",salt="yan",default="")
    
    • :時間を設定するときは、「取得した時刻がデフォルトとすべきとき=、「それ以外の場合はエラーになり、」」=デフォルトを持つことができません

set_signed_cookieクッキーに21秒後に失敗したことを示す、max_ageの= 21秒で提供される場合

  • set_signed_cookieを設定することにより、get_signed_cookieのset_cookieは、コ​​ントラストの設定を取得し、request.COOKIES.get(キー)を取得

    両方が対になっており、いずれも使用することはできません

    set_signed_cookieは、このような赤いボックスに、1を設定すると、暗号化されたクッキーを設定し、まだ応答クッキーに表示されます:

  • 安全な= trueに設定すると、あなただけのHTTPSを継続するには、ログインして、劇中loginSecure✔に応答クッキーを見ることができます。

  • HTTPのみ=真のHTTPプロトコルのみをログに記録します

  • [削除]

    • 用途:以前にユーザーのブラウザのユーザーの削除のために設定されたCookieの値
    ret = redirect("/login/")
    ret.delete_cookie("login")
    • 例:ユーザー出口

      def logout(request):
          ret= redirect("/login/")#退出回到登录页面
          ret.delete_cookie("login")#清除Cookie
          return ret

2.2Session

session由来

  • 何か新しいことの必要性があり、それはより多くのバイトをサポートすることができ、そして彼は、サーバー上に保存され、高いセキュリティがあります。これはセッションです。
    • 最大限のサポート4096バイトに自分自身をクッキー。
    • クッキー自体は、傍受または盗難に遭ったことがあり、クライアントに保存されています。
  • しかし、テキスト形式のクッキーはローカルに保存され、彼らのセキュリティが貧弱である;我々は、セッションに対応し、異なるクッキーを介してユーザを識別することができますので、「誰が」人々にサーバを知らせ、欠けているHTTPステートレスのためにアップクッキー4096バイトより個人情報及びテキストを保存インチ

  • コンポーネント(クッキーを依存しているため)のグループのためにサーバー上に保存されたセッションキーは、送信する必要はありません

  • 関連テーブルDjangoのセッションデータベースに格納されたセッションデータ

セッションの方法

  • 設定されたセッション

    request.session[key] = values
    request.session.setdefault('k1',123)
  • セッションの取得

    request.session.get(key,None)
  • 削除セッション

    del request.session[key]
  • ログは、検証セッションを達成します

    class Login(View):
        def get(self,request):
            return render(request,"login.html")
        def post(self,request):
            username = request.POST.get("username")
            pwd = request.POST.get("pwd")
            obj = models.User.objects.filter(username=username,pwd=pwd)
            if obj:
                url = request.GET.get("return_url")
                if url:
                    ret = redirect(url)
                else:
                    ret = redirect("/home/")
                #设置session login
                request.session['login'] = 1
    
    
                return ret
    
            return render(request,"login.html",{"error":"用户名密码不正确"})
    
    def login_required(func):#装饰器,判断当前访问状态
        def inner(request,*args,**kwargs):
            #获取session 
            login = request.session.get("login")
            print(login)
            url = request.path_info
            if login != 1:
                return redirect("/login/?return_url={}".format(url))
            ret = func(request,*args,**kwargs)
            return ret
        return inner
    
    
    @login_required
    def home(request):
        return render(request,"home.html")
    
    
    @login_required
    def index(request):
        return render(request,"index.html")
    
    • 図格納されたデータベースのSessionID = SESSION_KEYから分かるように

セッションフロー分析:

  • フローチャート

  • セッション表

  • ブラウザ

浏览器访问服务器,服务器会自动生成一个随机字符串,设置的值放置在一个字典当中,随机生成的字符串放在Django-session表中session-key字段,数据放在session-data中(加密后),expire_date是超时时间。并保存

把数据库session-key随机字符串放在cookie里返回给浏览器,也就是sessionid。可以理解为sessionid为cookie ,value为返回随机字符串

待到下次访问时会携带cookie(也就是sessionid),服务器会根据cookie从数据库中找到相应数据,再解密返回给浏览器。

由此可知session不能独立使用,必须依赖于cookie使用

他の方法でのセッション

  • すべて、キー、値、キーと値のペアを取得します。

    request.session.keys()
    request.session.values()
    request.session.items()
  • 取得SESSION_KEY

    request.session.session_key
  • 有効期限データの削除

    request.session.clear_expired()
    • 例:無効なデータを削除します

  • セッションセッションキーがデータベースに存在するかどうかをチェックします

    request.session.exists("session_key")
    • request.session.exists( "SESSION_KEY")

      def index(request):
          ret = request.session.session_key
          result= request.session.exists(ret)
          print(result)#True
          return render(request,"index.html")
  • クッキーを削除しない、現在のすべてのセッションのセッションデータを削除します。

    request.session.delete()
    • 終了し、ライブラリ内の情報を削除

      def logout(request):
          ret= redirect("/login/")
          request.session.delete()
          return ret
  • 現在のセッションデータを削除し、セッションクッキーのセッションを削除

    request.session.flush()
    • この文が実行されると

  • クッキーセッションとセッションタイムアウト設定(タイムアウトの後に、クッキーを削除しますが、データベースセッションがあります)

    request.session.set_expiry(value)
      如果value是整整数,session会在相应秒数后失效
      如果value是个datatime获取timedelta,session就会在这个时间后失效
      如果value是0,用户关闭浏览器session就会失效
      如果value是None,session会依赖全局session失效策略
    • 例:request.session.set_expiry(10)

Djangoのセッション構成で

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

ヒント

  • コンフィギュレーションセッションを参照する方法

    from django.conf import global_settings
    #ctrl + 鼠标左键点击global_settings进入文件global_settings.py然后搜索session,可以看到配置
  • キャッシュの設定

    from django.contrib.sessions.backends import db
    #ctrl + 鼠标左键点击db进入文件,通过以下操作可以看到session存在位置

3.JQueryクッキーの操作

  • まず、あなたがJquery.cookie.jsとjqueryのファイルをダウンロードする必要があり、jquery.cookie.jsダウンロード

    http://plugins.jquery.com/cookie/

    //连接jquery
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="js/jquery.cookie.js"></script>
  • クッキーを追加

        <script>
            var res = $.cookie("the_cookie","the_value");
            console.log(res);
        </script>

  • クッキーを作成し、設定された有効時間は7日です

    $.cookie('the_cookie', 'the_value', { expires: 7, path: '/' });
  • 読むクッキー

    $.cookie('the_cookie');
  • 削除クッキー

    $.cookie('the_cookie', null);   //通过传递null作为cookie的值即可
  • オプションのパラメータ

    $.cookie('the_cookie','the_value',{
        expires:7, 
        path:'/',
        domain:'jquery.com',
        secure:true
    }) 
  • パラメータ

    expires:(Number|Date)有效期;设置一个整数时,单位是天;也可以设置一个日期对象作为Cookie的过期日期;
    path:(String)创建该Cookie的页面路径;
    domain:(String)创建该Cookie的页面域名;
    secure:(Booblean)如果设为true,那么此Cookie的传输会要求一个安全协议,例如:HTTPS;

4.一般的なHTTPリクエスト・ヘッダー

プロトコルヘッダ 説明 状態
受け入れます 許容される各コンテンツタイプ(Content-Types 受け入れ:text / plainの 固定
受け入れ、文字セット 受け入れ可能な文字セット Accept-Charset: utf-8 固定
受け入れエンコード 許容応答内容をコード化します。 Accept-Encoding: gzip, deflate 固定
Cache-Control 機構をキャッシュするかどうかを、現在の要求/応答を指定するために使用されます。 Cache-Control: no-cache 固定
クッキー 介してサーバに先立ちSet-Cookie、HTTPプロトコルクッキー提供(下記参照) Cookie: $Version=1; Skin=new; 修正:標準
ホスト これは、サーバーのドメイン名とポート番号は、サーバ上で待機している表します。要求されたポートが標準サービス(80)に対応するポートである場合、ポート番号は省略してもよいです。 Host: www.itbilu.com:80``Host: www.itbilu.com 固定
リファラー ページが現在のページにブラウザのリンクページにアクセスする前に考えることができる前に、訪問は、ブラウザを表します。Referer実際には、それはあるReferrer単語が、スペルが間違っ標準RFCを作成するには、それを使うのは間違っているだろうReferer リファラー:http://itbilu.com/nodejs 固定
ユーザーエージェント ブラウザの文字列のアイデンティティ User-Agent: Mozilla/…… 固定
コンテンツタイプ (POSTやPUTリクエストのための)要求のMIMEタイプのボディ コンテンツタイプ:アプリケーション/ x-www-form-urlencodedで 固定

5.一般的なHTTP応答ヘッダー

レスポンスヘッダ 説明 状態
Cache-Control 彼らは、オブジェクトとキャッシュの有効時間をキャッシュすることができるかどうかを示すクライアントのキャッシュ機構へのサーバーからすべての通知。それ秒 Cache-Control: max-age=3600 固定
状態 現在のHTTP接続に対応して状態を説明するためのCommon Gateway Interfaceに応じて、ヘッダーフィールド、。 Status: 200 OK
ロケーション 用于在进行重定向,或在创建了某个新资源时使用。 Location: http://www.itbilu.com/nodejs
Server 服务器的名称 Server: nginx/1.6.3 固定
Date 此条消息被发送时的日期和时间(以RFC 7231中定义的"HTTP日期"格式来表示) Date: Tue, 15 Nov 1994 08:12:31 GMT 固定
Connection 客户端(浏览器)想要优先使用的连接类型 Connection: keep-alive``Connection: Upgrade 固定
Content-Length 以8进制表示的请求体的长度 Content-Length: 348 固定

おすすめ

転載: www.cnblogs.com/xujunkai/p/11848043.html