一、会话控制

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应用开发实战第十一章的更多相关文章

  1. 【全面解禁!真正的Expression Blend实战开发技巧】十一章 全面解析布局(Grid & Canvas &StackPanel &Wrappanel)

    原文:[全面解禁!真正的Expression Blend实战开发技巧]十一章 全面解析布局(Grid & Canvas &StackPanel &Wrappanel) 写这篇文 ...

  2. 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两种软件体 ...

  3. 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码

    在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...

  4. 微软实战训练营(X)重点班第(1)课:SOA必备知识之ASP.NET Web Service开发实战

    微软实战训练营 上海交大(A)实验班.(X)重点班 内部课程资料 链接:http://pan.baidu.com/s/1jGsTjq2 password:0wmf <微软实战训练营(X)重点班第 ...

  5. Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序

    Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序 C#原本是用来编写Windows以及Windows Phone的应用程序.自从Xamarin问世后.C#的作用就发生了非常大的变化 ...

  6. Web前端开发实战6:CSS实现导航菜单结合二级下拉式菜单的简单变换

    前面几篇博文都在讲导航菜单和二级下拉式菜单,事实上有非常多方法都能够实现的.详细的情况还要视情况而定. 在后面学习到jQuery框架之后,会有更丰富的动画效果.因为在学习Ajax和jQuery的初步阶 ...

  7. [目录]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 ...

  8. Django Web接口开发

    什么是接口 接口一般来讲分为两种: (1)程序内部的接口:方法与方法.模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就 ...

  9. Web前端开发实战1:二级下拉式菜单之CSS实现

    二级下拉式菜单在各大学校站点.电商类站点.新闻类站点等大型?站点非经常见,那么它的实现原理是什么呢? 学习了Web前端开发的知识后,我们是能够实现这种功能的.复杂的都是从基础效果上加入做出来的.原理和 ...

  10. DirectX12 3D 游戏开发与实战第十一章内容

    仅供个人学习使用,请勿转载.谢谢! 11.模板 模板缓冲区(stencil buffer)是一种"离屏"(off-screen)缓冲区,我们可以利用它来实现一些效果.模板缓冲区.后 ...

随机推荐

  1. sql sever查询库中每个表是否存在某个列名 列出表名

    select t.TABLE_NAME from information_schema.columns t where t.COLUMN_NAME='列名';

  2. 墨者学院SQL注入(MySQL)的总结:

    ​ 我们打开靶机 ​ 在这个界面我们可以看见在密码的下面有一个停机公告,我们点进去,会发现可以发现这个公告是存在id的,又可以会出现漏洞.所以我们尝试着在id=1的后面加上and 1=1 ​ 我们可以 ...

  3. 错误修正记录:对应的VMware Tools脚本未能成功运行

    起因 装了台式机,想把笔记本里的vmware虚拟机迁移过来:复制过来后开机就出现这种情况,点开机.挂起.关机等操作会报错,然后无法挂起(再点一次就行) 或者使用下方的选项,而非上方包装过的功能,似乎也 ...

  4. mysql 表的创建,修改,删除

    查看数据库所有表 show tables 创建 create table 表名 ( 列名 类型 约束条件 ... ) 类型有整形: tinyint(1B) ,smallint(2B),mediumin ...

  5. Can't find PHP headers in /usr/include/php The php-devel package is required for use of this command.

    报错 phpize 编译扩展时,报错:Can't find PHP headers in /usr/include/php The php-devel package is required for ...

  6. windows 稀疏文件 (sparse file) 的一个实用场景——解决 SetEndOfFile 占据磁盘空间引入的性能问题

    前言 之前写过一篇文章说明文件空洞:<[apue] 文件中的空洞>,其中提到了 windows 稀疏文件是制造空洞的一种方式,但似乎没什么用处,如果仅仅处理占用磁盘空间的场景,使用SetE ...

  7. Ribbon-Loadbalancer自定义负载均衡策略:本地优先+偏向服务器优先

    Ribbon 核心顶层抽象 package com.netflix.loadbalancer; public interface IRule { Server choose(Object var1); ...

  8. 分布式一致性算法-Paxos、Raft、ZAB、Gossip

      为什么需要一致性 数据不能存在单个节点(主机)上,否则可能出现单点故障. 多个节点(主机)需要保证具有相同的数据. 一致性算法就是为了解决上面两个问题. 一致性算法的定义 一致性就是数据保持一致, ...

  9. CSAPP学习笔记——chapter4 处理器体系结构

    CSAPP学习笔记--chapter4 处理器体系结构 这一章相对于其它的章节,是相对来说比较困难的一章:其它章节的一些内容都在计组,计网,操作系统等课程里面已经接触过一些概念,但是有关处理器,我才发 ...

  10. 区块链特辑——solidity语言基础(五)

    Solidity语法基础学习 九.实战项目(一): 学以致用 UP主捐款合约 ·合约要求: ·建立时,需将合约的建立者设定成owner(constructor,msg.sender) ·需记录每个观众 ...