Django进阶之session

关于COOKIE和SESSION,参考 http://www.cnblogs.com/zhaof/p/7211253.html

基于cookie做用户验证时:敏感信息不适合放在cookie中

session依赖cookie

session原理

cookie是保存在用户浏览器端的键值对

session是保存在服务器端的键值对

session在服务端中存在的数据格式为:

session = {
   随机字符串1:{
   用户1的相关信息
    }
   随机字符串2:{
   用户2的相关信息
    }
}

session客户端即客户端的浏览器的cookie中存的数据是当前用户对应的随机字符串

样例:基于session实现用户登录认证

views.py内容如下:

from django.shortcuts import render,redirect

user_info = {
    'jack':{'pwd':'jack123'},
    'tom':{'pwd':'tom123'},
}
def login(request):
    # print(request.method)
    if request.method=="GET":
        return render(request,"login.html")
    if request.method =="POST":

        u = request.POST.get("username")
        p = request.POST.get("pwd")
        dic = user_info.get(u)
        # print(u,p)
        if not dic:
            return render(request,"login.html")
        if dic["pwd"] == p:
            # 1.生成随机字符串
            # 2.写到用户浏览器cookie
            # 3.保存到session中
            # 4.在随机字符串对应的字典中设置相关内容
            # session中设置值
            request.session['username'] = u
            request.session['is_login'] = True
            return redirect("/cmdb/index/")
        else:
            return render(request, "login.html")

def index(request):
    # 1.获取当前用户的随机字符串
    # 2.根据随机字符串获取对应信息
    # session中获取值
    if request.session.get('is_login'):
        return render(request,"index.html")
    else:
        return render (request,"login.html")

def logout(request):
    request.session.clear()
    return redirect('/cmdb/login/')

login.html内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/cmdb/login/" method="POST">
        <input type="text" name="username" placeholder="用户名">
        <input type="password" name="pwd" placeholder="密码">
        <input type="submit" value="提交">
    </form>
</body>
</html>

index.html内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>欢迎登陆 {{ request.session.username }}</h1>
    <a href="/cmdb/logout/">注销</a>
</body>
</html>

session的工作过程

1、    生成随机字符串

2、    写到用户浏览器的cookie中

3、    保存到session中

4、    在随机字符串对应的字典中设置相关内容

而上述过程在Django中的体现为:

request.session["username"]=u

这里的username为通过request.POST.get("username")从前端html页面中获取到的用户名信息

注意:

在Django中要用session中一定要先执行:

python manage.py makemigrations

python manage.py migrate

当用户登录的时候的就会在数据库的django_session表中记录session信息

同样的通过request.session.get("username")也可以获取相应的值

在这个过程中:

1、    首先获取当前用户的随机字符串

2、    根据随机字符串获取对应的内容

session的操作

request.session["k1"]  如果不存在则会报错

request.session.get("k1"),如果不存在则会报错,为了防止出错可以request.session.get('k1',none)

request.session['k1'] = 123 设置session值

request.session.setdefault('k1',123)  存在则不设置

del request.session['k1']  删除

request.session.clear()    删除

所有 键、值、键值对

request.session.keys()

request.session.values()

request.session.items()

request.session.iterkeys()

request.session.itervalues()

request.session.iteritems()

获取当前用户session的随机字符串

request.session.session_key

将所有Session失效日期小于当前日期的数据删除

request.session.clear_expired()

检查 用户session的随机字符串 在数据库中是否

request.session.exists("session_key")

删除当前用户的所有Session数据

request.session.delete("session_key")

request.session.set_expiry(value)

默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的

如果value是个整数,session会在些秒数后失效。

如果value是个datatime或timedelta,session就会在这个时间后失效。

如果value是0,用户关闭浏览器session就会失效。

如果value是None,session会依赖全局session失效策略。

配置setting.py

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

Django中对于session的存储方式

Django中支持session,其中内部提供了5种类型的session供开发者使用:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

1、如果是数据库,需要在settings.py中配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.db' (引擎(默认))

2、如果是缓存session,需要在settings.py中配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'(引擎)

SESSION_CACHE_ALIAS= 'default'  使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

1、    如果是文件session, 需要在settings.py中配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.file' (引擎)

SESSION_FILE_PATH=None  缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()   

2、    如果是缓存+数据库session,需要在settings.py中配置如下:

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'       (引擎)

原文地址:https://www.cnblogs.com/cyfiy/p/10235693.html