django_session

本文详细介绍如何在Django项目中使用Redis作为session存储及缓存机制,包括配置步骤、不同存储方式对比及缓存策略,适用于提升Web应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis保存session

测试版本

django 1.11.5
django-redis-4.10.0
redis-3.2.0
django-redis-sessions

session 信息可以存储为数据库、缓存、文件、cookie中

  • django 开启sesseion中间件–已默认开启
MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
]

1. 数据库存储session

1> 添加’django.contrib.sessions’ 到 INSTALLED_APPS
2> python manage.py migrate 生成session数据库表

2.文件存储session

设置SESSION_ENGINEdjango.contrib.sessions.backends.file
注: django 默认存储文件为/tmp

3.缓存存储在Cookie

设置SESSION_ENGINEdjango.contrib.sessions.backends.signed_cookies

4. 缓存存储session

  • 注:首先安装缓存数据库,可以本地安装,也可引用其他系统缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

当配置了缓存,你有俩种方式把数据存储到缓存中
1>. 数据只存储到到缓存中,数据不持久化到数据库中,当缓存满了或者重启后,数据将全部丢失
2>. 将数据持久保存到数据库中,SESSION_ENGINE 为"django.contrib.sessions.backends.cached_db". 这样每次写数据到缓存,同时也会写入到数据库中,数据库中保持了状态,这种方式,还需要配置session存储数据库。

  • 安装django-redis

pip install django-redis

  • 配置缓存数据存储到redis
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

可以不同粒度的缓存数据到redis,一般缓存view或者整个网站

1. 缓存view,整个页面

from django.views.decorators.cache import cache_page

    @cache_page(60 * 15)
    def index(request):
        return HttpResponse('hello world')

2. 全网站缓存
需要在settings.py文件中的MIDDLEWARE项添加相应的中间件: 
MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',  # 放在第一个
    ...其他中间件...
    'django.middleware.cache.FetchFromCacheMiddleware',  # 放在最后一个
    ]
    
# 另外的配置项
CACHE_MIDDLEWARE_SECONDS= 60     # 每个页面缓存的时间(单位:秒)
CACHE_MIDDLEWARE_ALIAS='xxx'  
  • 存储session到redis中
SESSION_REDIS = {
    'host': 'localhost',
    'port': 6379,
    'db': 0,
    'password': 'xx',
    'prefix': 'session',
    'socket_timeout': 1
}
SESSION_ENGINE = 'redis_sessions.session'
------------------------------------------------------------------
eg: 

def set_session(request):
      """"保存session数据"""

      request.session['username'] = 'Django'
      request.session['verify_code'] = '123456'
      return HttpResponse('保存session数据成功')

  def get_session(request):
      """获取session数据"""

      username = request.session.get('username')
      verify_code = request.session.get('verify_code')
      text = 'username=%s, verify_code=%s' % (username, verify_code)
      return HttpResponse(text)

通过redis-cli客户端可以查看

127.0.0.1:6379> select 4
OK
127.0.0.1:6379[4]> keys *
1) "session:0bjyuegx0i5ivyuzpb8ezgo0b35u2z4v"

参考

  1. https://docs.djangoproject.com/en/2.1/topics/http/sessions/
  2. https://django-redis-chs.readthedocs.io/zh_CN/latest/
  3. https://blog.youkuaiyun.com/Enjolras_fuu/article/details/79661582
  4. https://pypi.org/project/django-redis-sessions/
Django框架中的`django_session`是一个存储会话信息的数据库表,通常用于存储用户的会话数据。这些会话数据被序列化后存储在名为`session_data`的列中。默认情况下,`session_data`是一个文本字段,存储着序列化后的Python数据结构。 要解析`django_session`中的`session_data`数据,你可以通过以下步骤来进行: 1. 连接到数据库:首先需要连接到存储Django会话信息的数据库中。 2. 查询`django_session`表:通过SQL查询或者Django的ORM系统查询`session_key`对应的会话数据。 3. 反序列化数据:`session_data`列中的数据是序列化过的,需要使用Python的`pickle`模块或者Django自带的序列化工具来反序列化这些数据。 在Django中,通常需要直接与数据库交互来处理会话数据,因为Django提供了一套高级的会话框架,可以直接通过视图、模板、中间件等方式来读取或更新会话数据。如果确实需要对`session_data`进行直接操作,可以通过以下代码示例进行反序列化: ```python import pickle from django.contrib.sessions.models import Session # 获取特定session_key的会话数据 session_key = '你的session_key' try: session = Session.objects.get(session_key=session_key) # 反序列化session_data session_data = pickle.loads(session.session_data.encode('utf-8')) # session_data现在是一个字典,包含了所有的会话数据 except Session.DoesNotExist: print('Session does not exist') # 处理会话数据 # ... 你的代码逻辑 ... ``` 请注意,直接操作数据库来修改会话数据可能会导致Django会话管理的一致,因此通常建议使用Django提供的API来管理会话。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youyou9526

各位看官,给点下载积分吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值