首页 > 其他分享 >Django Session 原理及配置和使用

Django Session 原理及配置和使用

时间:2023-01-17 16:32:58浏览次数:42  
标签:... Session request Django 会话 session key 原理 django

1、Django如何使用session 会话

1.1)session会话是通过中间件实现的,所以首先需要配置MIDDLEWARE

MIDDLEWARE = [
... ...
'django.contrib.sessions.middleware.SessionMiddleware',
... ...
]

1.2)默认的session会话引擎是 django.contrib.sessions.model.Session , 具体源码参考

# django/conf/global_settings.py
# The module to store session data
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# Cache to store session data if using the cache session backend.
SESSION_CACHE_ALIAS = 'default'

所以需要在 INSTALLED_APPS 中配置

INSTALLED_APPS = [
... ...
'django.contrib.sessions',
... ...
]

然后执行 ​​python manage.py migrate​​来安装生效,使用数据库表来存储会话数据。

目前高版本的Django创建项目之后默认是采用的数据库存储,且是已经配置完成的。 如果不想使用session,可以删除如上两个配置

但是如果想使用其他的方式存储会话,就需要明确配置 ​​SESSION_ENGINE​​及相关的其他配置

2、配置会话引擎

2.1、使用数据库存储会话 具体的配置参考上面介绍

2.2、使用缓存cache存储会话 使用缓存存储,可以更好的提供性能。比如这里使用 Redis/Memcached作为缓存

# proj/settings.py
# 先配置CACHE 缓存
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379',
},
'as_session': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': '127.0.0.1:11211',
}
}

上面配置两个缓存的目的是想说明,在Django默认的全局配置中 ​​SESSION_CACHE_ALIAS​​默认选择的是​​default​​,除了default,当然可以选择其他的缓存,比如 as_session 的 memcached 缓存 这个时候需要明确的配置

# proj/settings.py
# Cache to store session data if using the cache session backend.
SESSION_CACHE_ALIAS = 'as_session'
# The module to store session data
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

2.3、使用文件存储会话

# proj/settings.py
# The module to store session data
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# 默认是 tempfile.gettempdir()
# 一定要保证对应的程序有权限读写
SESSION_FILE_PATH = '/data/proj/file_session.txt'

2.4、使用cookie存储会话

# proj/settings.py
# The module to store session data
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

该会话引擎会用到项目配置的 ​​SECRET_KEY​​ 已经Django内置的 加密工具(参考 https://docs.djangoproject.com/zh-hans/4.1/topics/signing/)

2.5、特殊的 cached_db 存储会话 其实除了上面提到的四种方式之外,还有另外一种​​组合方式cached_db​​ 通过阅读源码发现

# django.contrib.sessions.backends.cached_db.py

from django.conf import settings
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.core.cache import caches

KEY_PREFIX = "django.contrib.sessions.cached_db"


class SessionStore(DBStore):
"""
Implement cached, database backed sessions.
"""
cache_key_prefix = KEY_PREFIX

def __init__(self, session_key=None):
self._cache = caches[settings.SESSION_CACHE_ALIAS]
super().__init__(session_key)
... ...

源码中 DBStore 其实就是 基于数据库的会话存储,然后这里的 cached_db 继承自DBStore,然后同时新增了 ​​self._cache ​​是基于缓存的会话存储方式。

视图中使用session

在视图中可以直接通过 ​​request.session​​ 使用,它实质上是 HttpResquest对象的 session属性。

为何能直接使用呢?主要是通过 SessionMiddleware 中间件来生效的

# django/contrib/sessions/middleware.py

from django.utils.deprecation import MiddlewareMixin

class SessionMiddleware(MiddlewareMixin):
# RemovedInDjango40Warning: when the deprecation ends, replace with:
# def __init__(self, get_response):
def __init__(self, get_response=None):
super().__init__(get_response)
engine = import_module(settings.SESSION_ENGINE)
self.SessionStore = engine.SessionStore

def process_request(self, request):
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
# 核心代码
request.session = self.SessionStore(session_key)

然后所以的 会话引擎都是继承自 ​​SessionBase​​ ,该类提供了一些标准的​​字典方法​

# django/contrib/sessions/backends/base.py

class SessionBase:
def __getitem__(self, key):
# val = request.session[key]
... ...
def __setitem__(self, key):
# request.session[key] = val
... ...
def __delitem__(self, key):
# del request.session[key]
... ...
def __contains__(self, key):
# key in request.session
... ...
def get(self, key, default=None):
# val = request.session.get('key', 'default_val')
... ...
def pop(self, key, default=__not_given):
# val = request.session.get('key', 'default_val')
... ...
... ...

还有很多方法,比如 set_expiry() \ cycle_key() 等等,感兴趣的可以自己查阅源码

标签:...,Session,request,Django,会话,session,key,原理,django
From: https://blog.51cto.com/colinspace/6017386

相关文章

  • Django自定义认证系统原理及源码分析解读
    疑问Django在​​如何自定义用户登录认证系统的时候​​,大家都会里面立马说自定义一个或者多个backend,比如通过账号+密码、邮箱+密码,邮箱+验证码、手机号+短信验证码等等......
  • 【纠错编码原理】1-纠错编码的基本概念:简单入门
    纠错编码的基本概念纠错编码就是在信息序列中加入一些冗余码元,组成一个相关的码元序列——码字,译码时利用码元之间的相关性质类检测错误和纠正错误。不同的纠错编码方法有......
  • Vue3 响应式原理
     响应式原理Vue2使用的是 Object.defineProperty Vue3使用的是Proxy2.0的不足对象只能劫持设置好的数据,新增的数据需要Vue.Set(xxx) 数组只能操作七种方法,修改某......
  • DHCP工作原理及介绍
    DHCP介绍动态主机配置协议DHCP(DynamicHostConfigurationProtocol)是一种用于集中对用户IP地址进行动态管理和配置的技术。即使规模较小的网络,通过DHCP也可以使后续增加......
  • 生成树原理及配置
    STP协议介绍STP(SpanningTreeProtocol)是运行在交换机上的二层破环协议,环路会导致广播风暴、MAC地址表震荡等后果,STP的主要目的就是确保在网络中存在冗余路径时,不会产生环......
  • 【Dubbo3 终极特性】「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据
    承接上文通过之前的【Dubbo3终极特性】「云原生三中心架构」带你探索Dubbo3体系下的配置中心和元数据中心、注册中心的原理及开发实战(上),让我们对Dubbo3的三中心架构体系......
  • 【Dubbo3 终极特性】「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据
    承接上文通过之前的【Dubbo3终极特性】「云原生三中心架构」带你探索Dubbo3体系下的配置中心和元数据中心、注册中心的原理及开发实战(上),让我们对Dubbo3的三中心架构体系有......
  • 认识了解递归的原理,学会递归的运用
    当n=1时,将不再调用print函数,出来打印1#include<stdio.h>voidprint(intn){if(n>9){print(n/10);}printf("%d",n%10);}intmain(){unsignedintnu......
  • 计算机组成原理
    一、计算机发展历程计算机系统=硬件(决定瓶颈)+软件(性能的发挥程度)(系统软件+应用软件)硬件的发展:第一代:电子管第二代:晶体管第三代:中小规模集成电路第四代:大规模及超......
  • Iptables原理介绍
    Linux防火墙——iptables原理介绍原创 liugp 大数据与云原生技术分享 2023-01-0207:30 发表于广东收录于合集#linux13个#防火墙3个#iptables2个一、......