Django Web应用开发实战第十一章
一、会话控制
Django内置的会话控制简称为session,可以为用户提供基础的数据存储。
数据主要存储在服务器上,并且网站上的任意站点都能使用会话数据。
当用户第一次访问网站时,网站的服务器将自动创建一个session对象,该session对象相当于该用户在网站的一个身份凭证,而且session对象中的数据不会丢失,只有session过期或被清理时,服务器才将session中存储的数据清空并终止该session。 session & cookie
- session存储在服务器端,cookie存储在客户端,所以session的安全性比cookie高
- 当获取某用户session数据时,首先从用户传递的cookie里获取sessionid,然后根据sessionid在网站服务器找到相应的session
- session存放在服务器的内存中,session的数据不断增加会造成服务器的负担,因此存放在session中的数据不能过于庞大 session数据默认存储在数据表django_session中,也可以设置保存方式:
# 数据库保存方式,可配置
# 默认保存方式
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 以文件形式保存
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 使用文件保存可以设置文件保存路径
SESSION_FILE_PATH = '/MyDjango' # 以缓存形式保存
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# 设置缓存名
SESSION_CACHE_ALIAS = 'default' # 以数据库加缓存形式保存
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 以cookie形式保存
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 其他属性配置
SESSION_COOKIE_NAME = 'sessionid' # 浏览器的Cookie以键值对的形式保存,该设置session_key的key SESSION_COOKIE_PATH = '/' # 设置cookie生效路径,默认值为'/',即127.0.0.1:8000 SESSION_COOKIE_DOMAIN = None # 设置浏览器cookie生效域名 SESSSION_COOKIE_SECURE = False # 设置传输方式,False表示使用HTTP,否则HTTPS SESSION_COOKIE_HTTPONLY = True # 是否只能使用HTTP SESSION_COOKIE_AGE = 1209600 # 设置cookie有效期,默认两周 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得cookie过期,默认False SESSION_SAVE_EVERY_REQUEST = False # 是否每次发送后保存cookie,默认为False # session读写
# 获取存储在session的数据,直接取key不存在会报错
request.session['k1']
request.session.get('k1', '')
request.session.setdefault('k1', '') # 设置session数据
request.session['k1'] = 123 # 删除session中的数据
del request.session['k1'] # 删除整个session
request.session.clear() # 获取session的keys
request.session.keys() # 获取session的values
request.session.values() # 获取session的session_key,即数据表django_session中的session_key字段
request.session.session_key
二、缓存机制
缓存类型:
- 全站缓存:一般情况下不采用
- 视图缓存:当用户发送请求的视图已生成缓存数据则以缓存数据作为响应内容
- 路由缓存:作用与缓存视图相同,两者区别在于两个路由同指一个视图,路由缓存会判断路由地址是否已生成缓存而决定是否执行视图函数
- 模板缓存:看减少模板引擎解析生成HTML的时间 【全站缓存】
配置中间件
MIDDLEWARE = [
# 配置全站缓存
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# 添加中间件LocaleMiddleware
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 配置全站缓存
'django.middleware.cache.FecthFromCacheMiddleware',
]
# 设置缓存生命周期
CACHE_MIDDLEWARE_SECONDS = 15
# 设置缓存数据保存在数据表中
# 属性值default来自于缓存配置CACHES的default
CACHE_MIDDLEWARE_ALIAS = 'default'
# 设置缓存表字段cache_key的值
# 用于同一Django项目多个站点之间的共享缓存
CACHE_MIDDLEWARE_KEY_PREFIX = 'MyDjango' 【视图缓存】
from django.views.decorators.cache import cache_page # 参数cache相当于CACHE_MIDDLEWARE_ALIAS
@cache_page(timeout=10, cache='MyDjango', key_prefix='MyView')
def index(request):
pass 【路由缓存】
from django.urls import path
from . import views urlpatterns = [
path('', cache_page(time_out=10, cache='MyDjango', key_prefix='MyURL')(views.index), name='index')
]
三、CSRF防护
CSRF(Cross-Site Request Forgery,跨站请求伪造),也称One Click Attack或者Session Riding,通常缩写为CSRF或XSRF。
Django为了防护该类攻击,在用户提交表单时,表单会自动加入csrfmiddlewaretoken隐藏控件。
它会与网站后台保存的值进行匹配。不匹配会被CSRFMiddleware中间件(创建项目时默认开启)拦截,只适用于POST请求。 # 提交表单时加上
使用时在form标签下加入{% csrf_token %}
# 取消表单csrf防护
from django.views.decorators.csrf import csrf_exempt # 取消csrf防护
@csrf_exempt
def index(request):
pass
四、自定义中间件
settings.py配置的属性MIDDLEWARE中间件中进行设置,在创建项目,Django默认配置了7个中间件:
- SecurityMiddleware:内置的安全机制,保护用户与网站的通信安全。
- SessionMiddleware:会话session功能。
- CommonMiddleware:处理请求信息,规范化请求内容。
- CsrfViewMiddleware:开始CSRF防护功能。
- AuthenticationMiddleware:开启内置的用户认证系统。
- MessageMiddleware:开启内置的信息提示功能。
- XFrameOptionMiddleware:防止恶意程序点击劫持。

# 钩子函数
- __init__(): 初始化函数,运行Django自动执行
- process_request(): 完成请求对象的创建,但用户访问的网址尚未与网站的路由进行匹配
- process_view(): 完成用户访问网址与网站路由的匹配,单尚未执行视图函数
- process_exception(): 执行视图函数期间发生异常
- process_response(): 完成视图的执行,但尚未将响应内容返回浏览器
Django Web应用开发实战第十一章的更多相关文章
- 【全面解禁!真正的Expression Blend实战开发技巧】十一章 全面解析布局(Grid & Canvas &StackPanel &Wrappanel)
原文:[全面解禁!真正的Expression Blend实战开发技巧]十一章 全面解析布局(Grid & Canvas &StackPanel &Wrappanel) 写这篇文 ...
- Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录
第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...
- 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码
在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...
- 微软实战训练营(X)重点班第(1)课:SOA必备知识之ASP.NET Web Service开发实战
微软实战训练营 上海交大(A)实验班.(X)重点班 内部课程资料 链接:http://pan.baidu.com/s/1jGsTjq2 password:0wmf <微软实战训练营(X)重点班第 ...
- Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序
Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序 C#原本是用来编写Windows以及Windows Phone的应用程序.自从Xamarin问世后.C#的作用就发生了非常大的变化 ...
- Web前端开发实战6:CSS实现导航菜单结合二级下拉式菜单的简单变换
前面几篇博文都在讲导航菜单和二级下拉式菜单,事实上有非常多方法都能够实现的.详细的情况还要视情况而定. 在后面学习到jQuery框架之后,会有更丰富的动画效果.因为在学习Ajax和jQuery的初步阶 ...
- [目录]ASP.NET web api开发实战
第一章:Restful web service v.s. RPC style web service 第二章:ASP.NET web api v.s. WCF v.s. ASP.NET web ser ...
- Django Web接口开发
什么是接口 接口一般来讲分为两种: (1)程序内部的接口:方法与方法.模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就 ...
- Web前端开发实战1:二级下拉式菜单之CSS实现
二级下拉式菜单在各大学校站点.电商类站点.新闻类站点等大型?站点非经常见,那么它的实现原理是什么呢? 学习了Web前端开发的知识后,我们是能够实现这种功能的.复杂的都是从基础效果上加入做出来的.原理和 ...
- DirectX12 3D 游戏开发与实战第十一章内容
仅供个人学习使用,请勿转载.谢谢! 11.模板 模板缓冲区(stencil buffer)是一种"离屏"(off-screen)缓冲区,我们可以利用它来实现一些效果.模板缓冲区.后 ...
随机推荐
- DeFi(去中心化金融)的硬核知识
1. DeFi流动性挖矿:躺着赚利息的"矿工" 简单来说,流动性挖矿就像你往银行存钱赚利息,但这里存的是加密货币,利息更高,还能随时提现.比如你往Uniswap这样的去中心化交 ...
- C# 中的“相等判断”
C# 中的"相等判断" C# 中判断相等的方式很多,例如: 双等号 == 实例的 Equals() 方法 Object.Equals() 静态方法 Object.Refe ...
- MIT 操作系统6.S081第一章
1.1进程和内存 fork 父进程中 fork 返回 子进程的PID 子进程中 fork 返回 0 exit exit会让当前进程停止执行并释放资源(包括内存和打开的文件) 通常: 0 表示 成功 1 ...
- python包管理工具pip使用手册
pip是什么? pip 是 Python 标准库管理器,也就是一个工具让你安装不同的类库来使用. 当你要安装某些类库时,都会使用 pip,那 pip 除了安装类库之外,还能做什么呢? 首先,我们进入 ...
- MAMP使用简单教程
这个配置,没有域名访问,平时可以放些demo使用,如果需要域名访问请看MAMP PRO教程 启用服务 打开Launchpad中灰色的MAMP,进入界面后,点击Preferences,然后只需拿着鼠标点 ...
- IvorySQL 4.4 发布
IvorySQL 4.4 已于 2025 年 3 月 10 日正式发布.新版本全面支持 PostgreSQL 17.4,新增多项新功能,并修复了已知问题. 增强功能 PostgreSQL 17.3 增 ...
- Mavros & Mavlink
博客地址:https://www.cnblogs.com/zylyehuo/ 参考 https://www.bilibili.com/video/BV1x841167uG?spm_id_from=33 ...
- 使用LLaMA-Factory训练LLM大模型并用ollama调用
环境搭建 系统环境 需要Nvidia显卡,至少8G显存,且专用显存与共享显存之和大于20G 建议将非安装版的环境文件都放到非系统盘,方便重装或移植 以Windows11为例,非安装环境文件都放在 E ...
- Delphi 使控件变成圆角的方法
procedure RoundControl(Control: TWinControl; arc1, arc2: Integer); var R: TRect; Rgn: HRGN; begin wi ...
- 【技术分析】简单了解 AccessControl
当我们开发一个智能合约,但是里面有一些函数不能随便让别人调用,只能"拥有权限"的管理员能够调用,那么这时候我们会用到权限管理机制. 实现起来也很简单,设置一个 owner 变量,通 ...