Python - Django - session 的基本使用
urls.py:
1 2 3 4 5 6 7 8 9 10 11 | from django.conf.urls import url from app02 import views urlpatterns = [ # app02 url(r '^app02/login/' , views.login), url(r '^app02/home/' , views.home), url(r '^app02/index/' , views.index), url(r '^app02/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 64 65 66 | from django.shortcuts import render, redirect from functools import wraps def check_login(func): @wraps (func) def inner(request, * args, * * kwargs): ret = request.session.get( "login" ) if ret = = "success" : # 如果已经登录过 return func(request, * args, * * kwargs) else : # 没有登录过的 跳转到登录页面 # 获取当前访问的URL next_url = request.path_info print (next_url) return redirect( "/app02/login/?next={}" . format (next_url)) return inner def login(request): if request.method = = "POST" : username = request.POST.get( "user" ) password = request.POST.get( "pwd" ) # 从URL里面取到 next 参数 next_url = request.GET.get( "next" ) if username = = "admin" and password = = "admin" : # 登录成功 if next_url: rep = redirect(next_url) # 得到一个响应对象 else : rep = redirect( "/app02/home/" ) # 得到一个响应对象 # 设置 session request.session[ "login" ] = "success" request.session[ "username" ] = username request.session.set_expiry( 60 ) # 60 秒之后失效 return rep ret = request.session.get( "login" ) if ret = = "success" : return redirect( "/app02/home/" ) else : return render(request, "app02/login.html" ) @check_login def home(request): username = request.session.get( "username" ) return render(request, "app02/home.html" , { "username" : username}) @check_login def index(request): username = request.session.get( "username" ) return render(request, "app02/index.html" , { "username" : username}) # 注销函数 def logout(request): request.session.flush() # 删除 session 数据和 cookie request.session.delete() # 只删除 session 数据,不删除 cookie return render(request, "/app02/login/" ) |
login.html:
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 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >登录页面</ title > </ head > < body > < p >登录页面</ p > < form action="{{ request.get_full_path }}" method="post"> {% csrf_token %} < p > 账号: < input type="text" name="user"> </ p > < p > 密码: < input type="text" name="pwd"> </ p > < p > < input type="submit" value="登录"> </ p > </ form > </ body > </ html > |
home.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >个人信息页面</ title > </ head > < body > < p >{{ username }} 的个人信息页面</ p > < a href="/logout/">注销</ a > </ body > </ html > |
index.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >主页面</ title > </ head > < body > < p >{{ username }} 的主页面</ p > < a href="/logout/">注销</ a > </ body > </ html > |
访问,http://127.0.0.1:8888/app02/login/
输入 admin、admin,点击登录
显示 mysite3.django_session 这个表不存在
执行命令:
1 2 | manage.py@mysite3 > makemigrations manage.py@mysite3 > migrate |
再看一下数据库
点进去看一下字段

expire_date 是 session 的过期时间
生成 table 之后,再来到 login 页面登录
登录成功
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 | request.session[ 'login' ] = 'false' # 设置 session 中的数据 request.session.get( 'login' ) # 通过 key 来获取 session 中的数据 request.session.exists( "login" ) # 判断 session 的 login 在数据库中是否存在 request.session.setdefault( 'login' , 'false' ) # 为 session 的 key 设置默认值 false del request.session[ 'login' ] # 删除 session 的 key 中的数据 request.session.delete() # 删除当前会话的所有 session 数据 request.session.flush() # 删除当前的 session 数据并删除 cookie request.session.clear_expired() # 将所有过期的 session 数据删除 request.session.session_key # 会话 session 的 key # 获取 session(字典) 中的所有 键、值、键值对 request.session.keys() # 提取所有键 request.session.values() # 提取所有值 request.session.items() # 提取所有键值对 request.session.iterkeys() # 迭代键 request.session.itervalues() # 迭代值 request.session.iteritems() # 迭代键值对 # 设置会话 session 和 cookie 的超时时间 request.session.set_expiry(value) # 如果 value 是个整数 n,session 会在 n 秒后失效 # 如果 value 是个 datatime 或 timedelta,session 就会在这个时间后失效 # 如果 value 是 0,用户关闭浏览器 session 就会失效 # 如果 value 是 None,session 会依赖全局 session 失效策略 |
settings.py 中的 session 配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 设置数据库 session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) # 设置缓存 session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是 memcache),此处别名依赖缓存的设置 # 设置文件 session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为 None,则使用 tempfile 模块获取一个临时地址 tempfile.gettempdir() # 设置缓存、数据库 session SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 # 加密 cookie session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 |
其他的设置:
1 2 3 4 5 6 7 8 | 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架