Djangoでのセッション制御

4641 ワード

Djangoは、sessionidを使用してユーザを区別する.セッション情報は、ファイル、データベース、または専用のサーバを使用して保存できる永続化処理が必要です.
セッション情報の構成settings.pyファイルを変更し、Djangoで使用されるセッション情報を構成します.詳細ドキュメントを表示します.
SESSION_ENGINE = 'Django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/var/django/session'
SESSION_COOKIE_AGE = 7200

次は一般的なオプションです.
  • SESSION_ENGINE-セッションエンジンを構成します.デフォルトはDjango.contrib.sessions.backends.dbです.Djangoはこのエンジンを使用してsessionidを保存し、Django.contrib.sessions.backends.cacheを除いて他のエンジンはデータの持続化を行い、sessionidをデータベースまたはファイルに保存します.
  • Django.contrib.sessions.backends.db
  • Django.contrib.sessions.backends.file
  • Django.contrib.sessions.backends.cache
  • Django.contrib.sessions.backends.cached_db
  • Django.contrib.sessions.backends.signed_cookies

  • SESSION_FILE_PATH-Django.contrib.sessions.backends.fileを使用する場合、ストレージパスが構成されます.
  • SESSION_COOKIE_NAME-クッキーのセッションUIDの名前を設定します.デフォルトはsessionidです.
  • SESSION_COOKIE_AGE-セッションの有効期限を設定します.

  • JAvascript削除sessionid失効
    Djangoでは、ユーザ終了機能を実現します.最初のスキームはlogout時にjsでクッキー情報を削除することである.chromeテストを使用すると、jsはクッキーのsessionidを削除できず、ユーザーが正常に終了できないことが分かった.
    Djangoドキュメントを問い合わせると、SESSION_COOKIE_HTTPONLYによって引き起こされたことがわかります.
  • SESSION_COOKIE_HTTPONLY-Trueに設定されている場合、jsはセッションクッキーにアクセスできません.jsではsessionidを削除できません.デフォルトはTrueです.
  • function() {
        ...
        CommonUtil.AjaxUtil.ajaxPost(
            '/logout/',
            null,
            function(result) {
                deleteCookie('sessionid', '/');
                window.location = '/';
            }
        );
        ...
    }
        
    function deleteCookie(name, path)
    {
        var exp = new Date();
        exp.setDate(exp.getDate() - 100);
        var cval=getCookie(name);
        if(cval!=null)
            document.cookie= name + "=" + cval + ";expires=" + exp.toGMTString() + ((path == undefined) ? "" : ";path=" + path);
    }
    
    SESSION_COOKIE_HTTPONLY = Trueが設定されている場合、views.pyからsessionidを削除する必要があります.Django.contrib.authからviewsが導入され、logout()関数が呼び出され、ログインユーザのsessionidが削除される.
    from Django.contrib.auth import views as auth_views
    
    def logout(request):
        if request.method == "POST":
            auth_views.logout(request)
            return HttpResponse(json.dumps({"status": True}), content_type='application/json')
    

    session動作原理
  • ユーザが初めてDjangoにアクセスすると、Djangoはユーザごとにsessionidを生成し、sessionidをブラウザに送信する.
  • Djangoは生成したセッション関連情報をSESSION_ENGINEに保存する.本例では,セッション情報をファイルに保存し,ファイル名はsessionidで始まり,後にsession UID,フォーマットはsessionidである.
    $ ls /tmp
    sessionidqj8bevv269sxt7dzqlrny1gcw7e1hkrg
    
  • ファイルに保存されているセッション情報には、sessionidのほか、request.session['username'] = usernameを使用して追加された情報があります.ファイルはbase64形式で符号化されます.
    $ cat /tmp/sessionidqj8bevv269sxt7dzqlrny1gcw7e1hkrg 
    

  • YWZhN2M3ZWEzNjk0YWU2NjUwZDIyNzdlNTA5NDc0NGY3NzMzYzlkOTp7InVzZXJuYW1lIjoiYWRtaW4iLCJ1aWQiOiIyNjdiNzliYS0yMTNhLTQ3NDItYjA0My1kMjMzMDVhMWQ1YmUiLCJ0b2tlbiI6IjVkOTFhMjM1ZDU3ODRiODk4ZmExMDUyZGQ1ZmZiNzkwODI2N2I3OWJhMjEwMTEyNjUyMTNhNDc0MmNhZWY0ZThkYjA0M2QyMzM4Njk5ZTAwMzA1YTFkNWJlNmNmM2Q1OWIiLCJyb2xlIjoiYWRtaW4iLCJpc3N1ZV90aW1lIjoiMTQ5MDg1NzIyNiIsImV4cGlyZV90aW1lIjoiMTgwMCJ9Cg== ```
       ,      。
    
    ```shell
    $ base64 -d /tmp/sessionidqj8bevv269sxt7dzqlrny1gcw7e1hkrg
    afa7c7ea3694ae6650d2277e5094744f7733c9d9:{"username":"admin","uid":"267b79ba-213a-4742-b043-d23305a1d5be","token":"5d91a235d5784b898fa1052dd5ffb7908267b79ba21011265213a4742caef4e8db043d2338699e00305a1d5be6cf3d59b","role":"admin","issue_time":"1490857226","expire_time":"1800"}
    ```
    
  • views.pylogout()が呼び出されると、Djangoはメモリ内のsessionidを削除し、データベース内のレコードやディスク上のファイルも削除します.この例では、/tmp/sessionidqj8bevv269sxt7dzqlrny1gcw7e1hkrgファイルが削除されます.
    from Django.contrib.auth import views as auth_views
    
    def logout(request):
        if request.method == "POST":
            auth_views.logout(request)
            return HttpResponse(json.dumps({"status": True}), content_type='application/json')