侧边栏壁纸
  • 累计撰写 122 篇文章
  • 累计创建 68 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Django-session

刘少锋
2022-01-04 / 0 评论 / 0 点赞 / 17 阅读 / 845 字

Session配置

Django项目默认启用Session

可以在settings.py文件中查看,如图所示

S4kTkK

如需禁用session,将上图中的session中间件注释掉即可。

存储方式

settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。

数据库

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式

SESSION_ENGINE='django.contrib.sessions.backends.db'

如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。

Q8ptvR

数据库中的表如图所示

6NOgHf

表结构如下

w9iwmT

由表结构可知,操作Session包括三个数据:过期时间

本地缓存

存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。

SESSION_ENGINE='django.contrib.sessions.backends.cache'

混合存储

优先从本机内存中存取,如果没有则从数据库中存取。

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

Redis

在redis中保存session,需要引入第三方扩展,我们可以使用**django-redis**来解决。

安装扩展

pip install django-redis

在settings.py文件中做如下设置

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

Session操作

通过HttpRequest对象的session属性进行会话的读写操作。

1) 以键值对的格式写session。

request.session['键']=值

2)根据键读取值。

request.session.get('键',默认值)

3)清除所有session,在存储中删除值部分。

request.session.clear()

4)清除session数据,在存储中删除session的整条数据。

request.session.flush()

5)删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']

6)设置session的有效期

request.session.set_expiry(value)
  • 如果value是一个整数,session将在value秒没有活动后过期。
  • 如果value为0,那么用户sessionCookie将在用户的浏览器关闭时过期。
  • 如果valueNone,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置**SESSION_COOKIE_AGE**来设置全局默认值。

session模拟用户登录

登录及设置登录标识

from django.views import View
from django.http.response import JsonResponse


class Login(View):
    @staticmethod
    def post(request):
        query_dict = request.POST  # 获取表单参数        
        userName = query_dict.get('userName', None)
        password = query_dict.get('password', None)
        if userName == "mac" and password == '123321':  # 校验用户是否登录成功            
            request.session['userName'] = userName  # 登录成功,设置session            
            return JsonResponse({"code": 200, "msg": "OK"})
        else:
            return JsonResponse({'code': 200, 'msg': "FAIL"})

登录校验

视图实现

from django.http import JsonResponse
from django.views import View


class UserInfo(View):
    @staticmethod
    def get(request):
        userName = request.session.get('userName', None)  # 获取session,判断用户是否已经登录        
        if userName is not None:
            return JsonResponse({
                "code": 200,
                "msg": "OK",
                "userInfo": {
                    "userName": userName,
                    "gender": "男",
                    "email": "mac321@163.com"
                }
            })
        else:
            return JsonResponse({
                "code": 200,
                "msg": "FAIL"
            })
0

评论区