day70 csrf简单用法 &Django ContentType
一、 什么是跨站请求伪造 CSRF
def transfer(request):
if request.method =='POST':
from_ =request.POST.get('from')
to_ =request.POST.get('to')
money =request.POST.get('money') print('{} 给{} 转了{} 钱'.format(from_,to_,money))
return HttpResponse('转账成功!')
return render(request, 'transfer.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>正经的网站</h1>
<form action="/transfer/" method="post">
{% csrf_token %}
<p>
转出:
<input type="text" name="from">
</p>
<p>
转入:
<input type="text" name="to">
</p>
<p>
金额:
<input type="text" name="money">
</p>
<p>
<input type="submit" value="提交">
</p>
</form> </body>
</html>
Django中内置了一个专门的处理csrf问题的中间件
django.middleware.csrf.csrfviewmiddleware
这个中间件做的事情:
1. 在rander返回页面的时候,在页面中塞了一个隐藏的input标签
我们在form 表单里写上 {%csrf -token%}
2. 在提交post数据的时候,它帮你做校验,如果校验不通过,就拒绝这次请求
二、ContentType
https://blog.csdn.net/ayhan_huang/article/details/78626957
Django contenttypes 应用
contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中。
每当我们创建了新的model并执行数据库迁移后,ContentType表中就会自动新增一条记录。比如我在应用app01的models.py中创建表class Electrics(models.Model): pass
。从数据库查看ContentType表,
那么这个表有什么作用呢?这里提供一个场景,网上商城购物时,会有各种各样的优惠券,比如通用优惠券,满减券,或者是仅限特定品类的优惠券。在数据库中,可以通过外键将优惠券和不同品类的商品表关联起来:
from django.db import models class Electrics(models.Model):
"""
id name
日立冰箱
三星电视
小天鹅洗衣机
"""
name = models.CharField(max_length=) class Foods(models.Model):
"""
id name
面包
烤鸭
"""
name = models.CharField(max_length=) class Clothes(models.Model):
name = models.CharField(max_length=) class Coupon(models.Model):
"""
id name Electrics Foods Clothes more...
通用优惠券 null null null
冰箱满减券 null null
面包狂欢节 null null """
name = models.CharField(max_length=)
electric_obj = models.ForeignKey(to='Electrics', null=True)
food_obj = models.ForeignKey(to='Foods', null=True)
cloth_obj = models.ForeignKey(to='Clothes', null=True)
通过使用contenttypes 应用中提供的特殊字段GenericForeignKey,我们可以很好的解决这个问题。只需要以下三步:
- 在model中定义ForeignKey字段,并关联到ContentType表。通常这个字段命名为“content_type”
- 在model中定义PositiveIntegerField字段,用来存储关联表中的主键。通常这个字段命名为“object_id”
- 在model中定义GenericForeignKey字段,传入上述两个字段的名字。
为了更方便查询商品的优惠券,我们还可以在商品类中通过GenericRelation字段定义反向关系。
示例代码:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey class Electrics(models.Model):
name = models.CharField(max_length=)
coupons = GenericRelation(to='Coupon') # 用于反向查询,不会生成表字段
def __str__(self):
return self.name class Foods(models.Model):
name = models.CharField(max_length=)
coupons = GenericRelation(to='Coupon') def __str__(self):
return self.name class Clothes(models.Model):
name = models.CharField(max_length=)
coupons = GenericRelation(to='Coupon') def __str__(self):
return self.name class Coupon(models.Model):
name = models.CharField(max_length=)
#以下三部骤
content_type = models.ForeignKey(to=ContentType) # step 1
object_id = models.PositiveIntegerField() # step 2
content_object = GenericForeignKey('content_type', 'object_id') # step 3 def __str__(self):
return self.name
1. 正向操作 ( object.content_type 即跨到另一张表上)
2. 反向查询
day70 csrf简单用法 &Django ContentType的更多相关文章
- Python--day70--csrf简单用法、 跨站请求伪造和csrf_token使用
1,csrf简单用法 2,Django里面的setting加入了防跨站伪造:这段代码帮你生成特殊字符串,帮你塞到html页面中来 3,csrf_token使用:
- python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- jquery.validate.js 表单验证简单用法
引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...
- JS的简单用法
JS的简单用法 参考:http://www.w3school.com.cn/js/js_switch.asp JavaScript 是网络的脚本语言 JavaScript 是可插入 HTML 页面的编 ...
- 使用一个Python脚本来运行一个简单的Django项目
创建视图 Django是一个模型-模板-视图(model-template-view,MTV)框架. 视图部分通常检查看HTTP给出的请求和查询或者结构,这些信息是发送到表示层的数据. 我们在 hel ...
- RESTful架构&简单使用Django rest framework
RESTful架构 1 什么是REST REST全称是Representational State Transfer,中文意思是表述性状态转移. 它首次出现在2000年Roy Fielding的博士论 ...
- 简单的django登录项目---带views视图函数(脚本文件)---用Bootstrap
简单的django登录项目 1.首先建立工程,建立工程请参照:https://www.cnblogs.com/effortsing/p/10394511.html 2.在Firstdjango工程项目 ...
- 跨站请求伪造(csrf),django的settings源码剖析,django的auth模块
目录 一.跨站请求伪造(csrf) 1. 什么是csrf 2. 钓鱼网站原理 3. 如何解决csrf (1)思路: (2)实现方法 (3)实现的具体代码 3. csrf相关的装饰器 (1)csrf_p ...
- CATransition(os开发之画面切换) 的简单用法
CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...
随机推荐
- popupMenu-----弹出菜单
import android.os.Bundle; import android.app.Activity; import android.graphics.Color; import android ...
- jquery正则表达式验证:验证身份证号码
需求说明: 前端页面使用正则表达式验证文本输入框输入的身份证号码是否符合规则. 代码说明: 这里只介绍正则表达式部分,其他部分的代码不做介绍.如有其它需求请自行修改即可. 步骤一:建立一个页面可以是h ...
- docker实战
docker基础入门 docker网络
- Eclipse下配置TinyOS开发环境
通过给Eclipse安装Yeti 2 - TinyOS 2 Plugin for Eclipse来配置TinyOS IDE,从而可建立TinyOS Project Yeti 2的介绍请参考网站:htt ...
- ILSpy 反编译.NET
ILSpy 是一个开源的.NET反编译工具,简洁强大易用是它的特征.在绝大多数情况下,它都能很好的完成你对未知程序集内部代码的探索.
- Byte字节与位
位(bit)字节(byte)一字节是8位所以2Byte是16位二进制
- IE8以下支持css3 border-radius渲染方法
这两天在做个集团网站,web前端妹子技术水平不咋样,写个web和wap 真够费劲的,对之前流行的H5和css3 响应式看来不太会用,扔给我一个半成品~~·非说各种canvas和border-radiu ...
- 什么是Jenkins 以及如何使用?
Jenkins是什么? Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测 ...
- 2018.09.26 洛谷P2464 [SDOI2008]郁闷的小J(map+vector)
传送门 本来出题人出出来想考数据结构的. 但是我们拥有map+vector/set这样优秀的STL,因此直接用map离散化,vector存下标在里面二分找答案就行了. 代码: #include< ...
- Python学习网站
Python Website: https://www.python.orgSource code: https://github.com/python/cpython Issue tracker: ...