16:django 有条件的视图处理(Last-Modified和ETag)&&加密签名
有条件的视图处理
上一节我们介绍了缓存来减轻服务器的负担,这里的有条件的视图处理也从一定程度上减轻了服务器的负担,在正式介绍之前,先来看两个概念: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 ...
随机推荐
- 学习web安全之--初识安全
随笔:随着互联网行业的飞速发展,互联网行业可谓日新月异,然而在繁华的背后,大多的互联网公司对于网络安全还是处于无重视,不作为的阶段,而作为一个程序员,如果也对信息安全视而不见的话,那将是这个公司的噩梦 ...
- mapper.xml配置读取不到
通常我们在sping的配置文件中,扫描到mapper文件,但是mapper.xml找不到,此时解决办法就是在pom中添加下面代码: <resources> <resource> ...
- [freemarker篇]03.如何处理空值
我想说的一点,我写的东西没有那么权威,这都是我实际开发中使用的,可能缺少很多! 例如这篇要说的如何处理空值,我发现我使用的跟网上很多写的不太一样,我也没有过多的去尝试网上的那么多写法! 抱歉,我只是写 ...
- 最新eclipse安装SVN插件
转载自:http://welcome66.iteye.com/blog/1845176 eclipse里安装SVN插件,一般来说,有两种方式: 直接下载SVN插件,将其解压到eclipse的对应目录里 ...
- [洛谷P1822] 魔法指纹
洛谷题目连接:魔法指纹 题目描述 对于任意一个至少两位的正整数n,按如下方式定义magic(n):将n按十进制顺序写下来,依次对相邻两个数写下差的绝对值.这样,得到了一个新数,去掉前导0,则定义为ma ...
- C11简洁之道:模板改进
1. 右尖括号 我们在C++98/03中使用泛型编程的时候,经常遇到“>>”被当作右移操作符,而不是模板参数的结尾.假如我们有如下代码: template <typename T& ...
- Flash Sort
FlashSort依然类似桶排,主要改进了对要使用的桶的预测,或者说,减少了无用桶的数量从而节省了空间,例如 待排数字[ 6 2 4 1 5 9 100 ]桶排需要100个桶,而flash sort则 ...
- web api 支持cors
1. configservice //******************* cors start *********************** var urls = Configuration[S ...
- zk-web
Ref:https://github.com/qiuxiafei/zk-web zk-web是一个用clojure with noir and boostrap写的Zookeeper WEB UI管理 ...
- 【BZOJ】1229 [USACO2008 Nov]toy 玩具
[算法]三分+贪心 [题解] 数据范围小的版本:餐巾计划 这题不是使用最小费用流的下凸函数,因为这题是要满足最大流,那么这题到底在三分什么? 三分的这个函数,其实是总费用随卖出玩具量变化而变化的函数, ...