【ジャンゴ】セッション - 2019年8月9日午前10時16分45秒

オリジナル:http://106.13.73.98/__/40/

@

入門


クッキーがある程度解決しますが、要件を「ホールド」が、4096バイトの最大サポート自体クッキー、クッキーやクライアント自体に保存されているため、傍受または盗難することができるため、したがって、何か新しいものが必要とされて、それをより多くのバイトをサポートし、それがサーバー上に保存され、高いセキュリティがあります。これはセッションです。

質問はステートレスなHTTPプロトコルの特性に基づいて、ある、サーバは、上記のクッキーので、橋渡しの役割を再生するには、「」訪問者を知りません。

私たちは、ユーザーがクッキーでアクセスするように、サーバーだった「」人に知っている、ユニークなIDが割り当てられ、各クライアントのクッキーを与えることができます。その後、我々、このような「アカウントのパスワード」など、いくつかの時間のためにサーバーに保存されているクッキーの、プライベートな情報に基づいて異なるID、というように。

結論:ステートレス不足HTTPのためのクッキーまで、自身安全性の低い、ローカルに保存されたテキスト形式でサーバー「は」人々に知らせますが、クッキー。だから我々は、以上の4096のテキストだけでなく、個人情報を保存するにはクッキー、対応するセッションによって異なるユーザを識別します。

クッキーとセッションは、上記の「もの」の共通性を言及し、そして言語は、フレームに限定されるものではありません。

Djangoの操作セッション


セッション内のデータを削除、設定、取得します。

def test(request):
    """设置键值对"""
    request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置

    """获取键值对"""
    user = request.session['user']  # 获取'user'的值
    pwd = request.session.get('pwd', None)  # 获取'pwd'的值, 如果不存在则返回None

    """删除键值对"""
    del request.session['user', 'pwd']  # 删除指定的键值对cookie
    # request.session.delete()  # 删除该用户的所有session, 不删除cookie
    # request.session.flush()  # 删除该用户的所有session, 删除cookie
    return HttpResponse('is ok')

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

def test(request):
    """设置键值对"""
    request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置

    """获取所有键、值、键值对"""
    keys = request.session.keys()  # dict_keys(['user', 'pwd'])
    values = request.session.values()  # dict_values(['zyk', '123'])
    items = request.session.items()  # dict_items([('user', 'zyk'), ('pwd', '123')])
    
    return HttpResponse('is ok')

オペレーショナル・セッションsession:

def test(request):
    """设置键值对"""
    request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置

    """会话session的key"""
    session_key = request.session.session_key  # liucwhvkrccdsgkcibvyu4ar5c56ssw1, 如果不存在则返回None

    """检查会话session的key在数据库中是否存在"""
    ret = request.session.exists(session_key)  # 存在返回True, 否则False

    """将所有Session失效日期小于当前日期的数据删除"""
    request.session.clear_expired()

    """删除当前会话的所有Session数据(不会删除键值对)"""
    request.session.delete()

    """删除当前会话数据并删除会话的Cookie(会删除键值对)"""
    request.session.flush()
    # 这用于确保前面的会话数据不可以再次被用户的浏览器访问.
    # 例如, django,contrib.auth.logout()函数中就会调用它.

    return HttpResponse('is ok')

タイムアウトセッションとクッキーのセッションを設定します。

def test(request):
    """设置键值对"""
    request.session['user'] = 'zyk'  # 设置键值对{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 设置键值对{'pwd': '123'}, 如果存在则不设置

    """设置会话Session和Cookie的超时时间"""
    value = 0
    request.session.set_expiry(value)
    # 如果value是个整数, session会在value秒后失效;
    # 如果value是个datatime或timedelta, session会在这个时间后失效;
    # 如果value是0, 用户关闭浏览器后session就会失效;
    # 如果Value是None, session会依赖全局session失效策略.
    # 默认超时时间为两周: SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
    
    # 设置超时时间后(非None), 可通过获取键值对获得失效时间('_session_expiry', 1):
    items = request.session.items()  # dict_items([('user', 'zyk'), ('pwd', '123'), ('_session_expiry', 1)])

    return HttpResponse('is ok')

セッションフロー分析:
ここに画像を挿入説明
*
セッションのログイン認証バージョン:**

# 装饰器函数
def login_request(fn):
    """如果未登陆,将返回login页面"""
    def inner(request, *args, **kwargs):
        if request.session.get('is_login') != '1':
            # 获取当前url路径
            next = request.path_info
            return redirect('/login/?next=%s' % next)
        ret = fn(request, *args, **kwargs)
        return ret
    return inner


# 登陆功能
def login(request):
    if request.method == 'POST':
        user, pwd = request.POST.get('user'), request.POST.get('pwd')
        if models.Userinfo.objects.filter(name=user, pwd=pwd):
            # 设置session
            request.session['is_login'] = '1'
            # 设置session超时时间,0:关闭浏览器时失效
            request.session.set_expiry(0)
            next = request.GET.get('next')
            ret = redirect(next) if next else redirect('/index/')
            return ret
    return render(request, 'login.html')


@login_request
def home(request):
    return HttpResponse("我是home页面")


# @login_request
def index(request):
    # 获取session的key
    # session_key = request.session.session_key
    return render(request, 'index.html')


@login_request
def logout(request):
    # 删除当前会话数据并删除会话的Cookie
    request.session.flush()
    return redirect('/login/')

セッションでのDjangoの設定:
Djangoのデフォルトサポートのセッションは、その内部には、使用する開発者のためのセッションの5種類を提供しています。

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

オリジナル:http://106.13.73.98/__/40/

おすすめ

転載: www.cnblogs.com/gqy02/p/11325463.html