Django中关于Session的使用示例

>>最全面的Java面试大纲及答案解析(建议收藏)  

session

Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。

django中session语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1、设置Sessions值
request.session['session_name'] ="admin"
2、获取Sessions值
session_name = request.session["session_name"]
3、删除Sessions值
del request.session["session_name"]
4、flush()
删除当前的会话数据并删除会话的Cookie。
这用于确保前面的会话数据不可以再次被用户的浏览器访问
 
5、get(key, default=None)
 
fav_color = request.session.get('fav_color', 'red')
 
6、pop(key)
 
fav_color = request.session.pop('fav_color')
 
7、keys()
 
8、items()
 
9、setdefault()
用户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失效策略。

session配置

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

a. 配置 settings.py

1
2
3
4
5
6
7
8
9
10
  SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
 
    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,默认修改之后才保存(默认)

登录案例

models.py

1
2
3
4
5
6
7
from django.db import models
 
# Create your models here.
 
class UserInfo(models.Model):
    user = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)

urls.py

1
2
3
4
5
6
7
8
9
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    # Session实现
    path('login_session/', views.login_session),
    path('index_session/', views.index_session),
    path('logout/', views.logout),
]

views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from django.shortcuts import render, HttpResponse, redirect
from app01.models import UserInfo
# Create your views here.
 
def login_session(request):
 
    if request.method == "GET":
        return render(request, "login.html")
    else:
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        user_obj = UserInfo.objects.filter(user=user,pwd=pwd).first()
        if user_obj:
 
            # 用户认证信息存储
            request.session['susername'] = user
            request.session['slogin'] = True
 
            '''
            if request.COOKIE.get("sessionid"):
                random_str=request.COOKIE.get("sessionid")
                在django-seesion表中过滤session-key=random_str的记录进行update
 
            else:
生成一个随机字符串   23423hkjsf890234sd
向django-session表中插入记录
                    session-key         session-data
                   23423hkjsf890234sd   {"susername":"egon","slogin":True}
响应set_cookie :   {"sessionid":23423hkjsf890234sd}
 
            '''
 
            return redirect("/index_session/")
        else:
            return HttpResponse('error')
 
def index_session(request):
    '''
    request.session
request.COOKIE.get("sessionid")   :23423hkjsf890234sd
在django-session表过滤session-key=23423hkjsf890234sd的记录
取过滤记录的session-data反序列化成数据字典:{"susername":"egon","slogin":True}
    '''
 
    slogin = request.session.get("slogin")
 
    if not slogin:
        return redirect("/login_session/")
 
    susername = request.session.get("susername")
    shangpin = "香蕉"
    shangpin_list = ["苹果", "荔枝", "榴莲"]
    return render(request, 'index.html', {'name': susername, 'shangpin': shangpin, 'shangpin_list': shangpin_list})
 
 
def logout(request):
    '''
request.COOKIE.get("sessionid")   :23423hkjsf890234sd
在django-session表过滤session-key=23423hkjsf890234sd的记录删除
response.delete_cookie("sessionid")
    '''
    request.session.flush()
    return redirect("/login_session/")

login.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <input type="text" name="user">
    <input type="password" name="pwd">
    <input type="submit">
</form>
</body>
</html>

index.html

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>用户名:{{ name }} <a href="/logout/">注销</a></p>
<p>{{ shangpin }}</p>
<p>{{ shangpin_list }}</p>
</body>
</html>

注意:一个浏览器跟服务器只能建立一次会话,多开几个窗口也没用,刷新页面后还是会跳转到你最后一次建立会话的页面。

原文:https://www.cnblogs.com/897463196-a/p/11754578.html