一、 什么是跨站请求伪造 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的更多相关文章

  1. Python--day70--csrf简单用法、 跨站请求伪造和csrf_token使用

    1,csrf简单用法 2,Django里面的setting加入了防跨站伪造:这段代码帮你生成特殊字符串,帮你塞到html页面中来 3,csrf_token使用:

  2. python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  3. jquery.validate.js 表单验证简单用法

    引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...

  4. JS的简单用法

    JS的简单用法 参考:http://www.w3school.com.cn/js/js_switch.asp JavaScript 是网络的脚本语言 JavaScript 是可插入 HTML 页面的编 ...

  5. 使用一个Python脚本来运行一个简单的Django项目

    创建视图 Django是一个模型-模板-视图(model-template-view,MTV)框架. 视图部分通常检查看HTTP给出的请求和查询或者结构,这些信息是发送到表示层的数据. 我们在 hel ...

  6. RESTful架构&简单使用Django rest framework

    RESTful架构 1 什么是REST REST全称是Representational State Transfer,中文意思是表述性状态转移. 它首次出现在2000年Roy Fielding的博士论 ...

  7. 简单的django登录项目---带views视图函数(脚本文件)---用Bootstrap

    简单的django登录项目 1.首先建立工程,建立工程请参照:https://www.cnblogs.com/effortsing/p/10394511.html 2.在Firstdjango工程项目 ...

  8. 跨站请求伪造(csrf),django的settings源码剖析,django的auth模块

    目录 一.跨站请求伪造(csrf) 1. 什么是csrf 2. 钓鱼网站原理 3. 如何解决csrf (1)思路: (2)实现方法 (3)实现的具体代码 3. csrf相关的装饰器 (1)csrf_p ...

  9. CATransition(os开发之画面切换) 的简单用法

    CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...

随机推荐

  1. 41-json.decoder.JSONDecodeError: Invalid control character at: line 6894 column 12 (char 186418)

    在使用python中将单词本的单词用正则匹配成字典后,以json存储,仪json读入,但是一直报错: 原因是: 正则处理后的数据有的出了点问题,导致一个字典的 有多个相同的键!!!,则肯定会报错啊!! ...

  2. 配置静态IP

    网卡配置静态IP地址编辑文件/etc/network/interfaces:sudo vi /etc/network/interfaces并用下面的行来替换有关eth0的行:# The primary ...

  3. tcl&redis安装

    http://www.linuxfromscratch.org/blfs/view/cvs/general/tcl.html tcl http://redis.io/topics/quickstart

  4. apicloud管理

    以下所有操作都是指“apicloud”平台下的管理: 1. 一定要记得备份证书.证书不是因为你记得别名和密码就能还原的.因为apicloud是服务器session存数据,千万不要打开多个app操作页面 ...

  5. 网段;IP;广播地址;子网掩码;

    网段(network segment)一般指一个计算机网络中使用同一物理层设备(传输介质,中继器,集线器等)能够直接通讯的那一部分.例如,从192.168.0.1到192.168.255.255这之间 ...

  6. $.fn.extend 和$.extend函数

    区别和详解:jQuery extend()和jQuery.fn.extend()     首先是简单的概述区别:$.extend()是类方法   $.fn.extend()是原型方法   对象方法和原 ...

  7. 2018.08.10 atcoder No Need(线性dp)

    传送门 输入一个序列an" role="presentation" style="position: relative;">anan,输入k&q ...

  8. 使用yum命令报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:

    背景: yum包的管理是使用python写的,有对应的python版本   遇到的问题报错如下: File "/usr/bin/yum", line 30     except K ...

  9. b4和tncl_extract_UNCL_new

    # -*- coding:utf-8 -*- import re ''' 适应新版本 注意: 1)17A文件改完后缀后,需要转为UTF-8无BOM格式,才能正确处理. 2)fr = open(file ...

  10. ArcGIS Desktop Python add-ins 共享和安装插件

    1)   共享和安装插件 共享Python插件的关键是.esriaddin文件;为了获取该插件功能,其他用户只要在本机执行安装操作或通过网络引用该插件就可以. ArcGIS插件安装工具 当用户双击一个 ...