有条件的视图处理
上一节我们介绍了缓存来减轻服务器的负担,这里的有条件的视图处理也从一定程度上减轻了服务器的负担,在正式介绍之前,先来看两个概念:Last-Modified和ETag
Last-Modified
ETag
请求流程
作用
知道了这两个概念之后,我们应该知道这两个概念的作用了吧,也大概知道我们接下来要讲解的是什么啦。没错,就是,django中如何使用Last-Modified和ETag这两个概念呢
condition装饰器
Last-Modified和ETag在django中是两个函数,前者返回一个日期类型数据,后者返回一个值(ETag值),这两个函数可以作为参数传递给django.views.decorators.http.condition这个装饰器,装饰器原型是
condition(etag_func=None, last_modified_func=None)
这是一个使用的简单例子
def latest_entry(request, blog_id):
return Entry.objects.filter(blog=blog_id).latest("published").published
from django.views.decorators.http import condition
@condition(last_modified_func=latest_entry)
def front_page(request, blog_id):
...
在django.views.decorators.http.condition文件里还提供了另外两个装饰器,可以使得只需要提供一个参数即可,看源码很容易懂:
def etag(etag_func):
return condition(etag_func=etag_func) def last_modified(last_modified_func):
return condition(last_modified_func=last_modified_func)
说完了Last-Modified和ETag,我们继续说一下
django加密签名
web应用安全的黄金法则是:永远不要相信从不受信任来源的数据。但有时候我们只能从不受信任的媒介获取或者发送数据,或者不受信任的媒介更具吸引力,比如我们确保我们的数据一定是安全的,并且不受信任的媒介比受信任媒介要快捷甚至便宜的多。加密签名的值一旦被篡改就会被检测到,这是我们能确保数据安全的共识。下面是几个加密签名应用的例子:
- 找回密码所用的url
- 确保form表单中的隐藏域没有被修改
- 一次性的允许访问保护数据的加密url
django提供了一个底层的用来加密数据的API和一个高层的用来设置和读取加密cookies的API
保护好你的SECRET_KEY
用django-admin.py startproject命令生成的项目自带一个自动随机生成的SECRET_KEY,注意不要泄露这个key
使用低层次的API
django的加密方法源代码位于django\core目录下的signing.py文件,可以具体去看看,下面是一些基本的用法:
>>> from django.conf import settings
>>> settings.configure()
>>> from django.core.signing import Signer
>>> signer = Signer()
>>> value = signer.sign("qiweijie")
>>> value
'qiweijie:lVrPb11e1K9K_DcxnMGNYk8t2aQ'
>>> original = signer.unsign(value)
>>> original
u'qiweijie'
使用“调味剂”参数(salt)
salt是“盐,调味剂”的意思,如果你不想每次对同一字符加密的结果都一样,那么你可以是用调味剂参数调剂一下,哈哈,看示例:
>>> signer = Signer()
>>> signer.sign('My string')
'My string:GdMGD6HNQ_qdgxYP8yBZAdAIV1w'
>>> signer = Signer(salt='extra')
>>> signer.sign('My string')
'My string:Ee7vGi-ING6n02gkcJ-QLHg6vFw'
>>> signer.unsign('My string:Ee7vGi-ING6n02gkcJ-QLHg6vFw')
u'My string'
验证时间戳
TimestampSigner是Signer的子类,添加了一个加密的时间戳给值。这允许你可以确保一个加密的数据是在一个给定的时间内创建的
>>> from django.core.signing import TimestampSigner
>>> signer = TimestampSigner()
>>> value = signer.sign('hello')
>>> value
'hello:1NMg5H:oPVuCqlJWmChm1rA2lyTUtelC-c'
>>> signer.unsign(value)
u'hello'
>>> signer.unsign(value, max_age=10)
...
SignatureExpired: Signature age 15.5289158821 > 10 seconds
>>> signer.unsign(value, max_age=20)
u'hello'
保护复杂的数据结构
列表,元组和字典,如果你直接使用上述的方法,最后得到的是一个字符串而不是原来的数据类型:
>>> dic = {1:2}
>>> sd=signer.sign(dic)
>>> signer.unsign(sd)
u'{1: 2}'
如果你想保护这些数据类型,请使用dumps和loads方法,它们都位于django.core.signing模块里面
- dumps(obj, key=None, salt='django.core.signing', compress=False)
- loads(string, key=None, salt='django.core.signing', max_age=None)
>>> from django.core import signing
>>> value = signing.dumps({"foo": "bar"})
>>> value
'eyJmb28iOiJiYXIifQ:1NMg1b:zGcDE4-TCkaeGzLeW9UQwZesciI'
>>> signing.loads(value)
{'foo': 'bar'}
16:django 有条件的视图处理(Last-Modified和ETag)&&加密签名的更多相关文章
-
django重点url,视图函数,模板语言
django重点url,视图函数,模板语言url 1.django重点url无命名分组:re_path() 2.url第一个参:url未命别名分组就不需要views中参数一定,若命别名(?P<y ...
-
Django学习笔记之视图高级-HTTP请求与响应
Django限制请求method 常用的请求method GET请求 GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改.比如向服务器获取某篇文章的详情. POST ...
-
Django框架 之 view视图
Django框架 之 view视图 浏览目录 概述 简单的视图 HttpRequest对象 CBV和FBV 给视图加装饰器 Request对象 Response对象 JsonResponse对象 Dj ...
-
Django多条件筛选查询
转自:https://www.jianshu.com/p/a86281df530e Django多条件筛选查询 主模型只存在外键一对多关系 模型设计 # 快捷筛选状态 class Status(mod ...
-
Django中的CBV视图
Web 开发是一项无聊而且单调的工作,特别是在视图功能编写方面更为显著.为了减少这种痛苦,Django植入了视图类这一功能,该功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发, ...
-
Django 的路由层 视图层 模板层
--------------------------------------------------------------通过苦难,走向欢乐.——贝多芬 Django-2的路由层(URLconf) ...
-
Django的View(视图)
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
-
Django框架详细介绍---视图系统
Django视图系统 1.什么是视图 在Django中,一个视图函数/类,称为视图.实质就是一个用户自定义的简单函数,用来接收WEB请求并xing响应请求,响应的内容可以是一个HTML文件.重定向.一 ...
-
Django中的View视图讲解
Django中的View视图(view.py)是负责处理用户请求和返回响应的逻辑. 视图函数或视图简而言之就是一个python函数,它接受一个web请求并返回一个Web响应. 此响应可以是网页的HTM ...
随机推荐
-
java课后作业 弹出窗口求两个数的加减乘除
//计算2个数的加减乘除 谷伟华 2015/10/6package jisuan; import javax.swing.JOptionPane; public class Jiasuan { pub ...
-
poj 2388 Who&#39;s in the Middle
点击打开链接 Who's in the Middle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28324 Acce ...
-
MAC 如何设置文件夹权限为777
1. cd 你的文件夹路径的上一级目录. 2. sudo chmod -R 777 你的文件夹名. 3. 输入密码. 4.成功
-
phpcms V9静态判断会员登录状态的方法
phpcms v9如何在任意地方判断会员的登录状态呢?在php中是比较好判断的,代码如下 <?php if (!$_userid){ echo"会员没有登录"; }else ...
-
Linux常用命令及vim的使用、vim常用插件(推荐)
看了3篇文章,很好 vim中的区域拷贝 剪切,粘贴: 正常模式,移动光标到剪切的区域开始处,按v,进入可视模式,然后选择区域.按x键,剪切.到指定位置按p粘贴. 撤销按u 恢复按ctrl-r 简明 ...
-
WM_CLOSE、WM_DESTROY、WM_QUIT的区别(询问,销毁窗口,退出进程,都不是一回事)
1.发送消息SendMessage.PostMessage PostMessage将消息放入消息队列后马上返回,而SendMessage直到窗口过程处理完消息后才返回 2.三个消息的区别 WM_CLO ...
-
将博客搬至CSDN http://blog.csdn.net/yi_xianyong
将博客搬至CSDN http://blog.csdn.net/yi_xianyong
-
cookie报错
错误: java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value 原因 ...
-
Git使用五:回到过去
reset:将仓库里面的内容恢复回暂存区,类似于从仓库里检出文件到暂存区checkout:将暂存区的文件恢复回工作区,即,把暂存区的文件检出到工作区 下面是之前三次提交的内容 三个区域的文件状态: 执 ...
-
VirtualBox虚拟机安装Mac OS 10.12
注:本文作者 (QQ:85805214) 本博主只是转载发布而已. VMware 安装Mac OS 方法 由于Virtual Box拷贝文件比较麻烦,有时候经常出现拷贝失败的情况,故使用VMware ...