django上课笔记3-ORM补充-CSRF (跨站请求伪造)
一、ORM补充
- ORM操作三大难点:
- 正向操作反向操作连表
- 其它基本操作(包含F Q extra)
- 性能相关的操作
- class UserInfo(models.Model):
- uid = models.BigAutoField(primary_key=True)
- username = models.CharField(max_length=32)
- passwd = models.CharField(max_length=64)
- age = models.ImageField(null=True) 插入一列,可以为空值
- ug = models.ForeignKey('UserGroup',null=True)
- def __str__(self):
- return self.name
- 在views.py的视图函数里查询数据时可以直接看到具体的名字信息并且根据了uid排序
- userinfo_list = models.UserInfo.objects.all().order_by('uid')
- 在views.py的视图函数里
- from django.db.models import Count,Sum,Max,Min
- # values里面的字符串是根据什么group by , A是聚合条件的别名, Count里的是聚合条件,filter(A__gt=2)相当于having
- v = models.UserInfo.objects.values('ut_id').annotate(A=Count('uid'))
- print(v.jquery)
- v = models.UserInfo.objects.values('ut_id').annotate(A=Count('uid')).filter(A__gt=2)
- F , Q , extra
- from django.db.models import F,Q,extra
- F,更新时用于获取原来的值
- models.UserInfo.objects.all().update(age=F(age+1)) #让数据库里所有的age+1
- models.UserInfo.objects.all().filter(id=1,name='root') #多个条件之间的关系是and关系
- Q,用于构造复杂查询条件
- models.UserInfo.objects.all().filter(Q(id=1) | Q(name='root')) # Q里边是or条件
- q1 = Q() #生成q1对象
- q1.connector = 'OR' #q1里3个条件的关系是or
- q1.children.append(('uid',1))
- q1.children.append(('uid',3))
- q1.children.append(('uid',5))
- q2 = Q() #生成q2对象
- q2.connector = 'OR' #q2里3个条件的关系是or
- q2.children.append(('age',1))
- q2.children.append(('age',3))
- q2.children.append(('age',5))
- con = Q() #生成con对象 con里边2个条件的关系是and
- con.add(q1,'AND')
- con.add(q2,'AND')
- 动态生成Q
- condition_dict = {
- 'k1':[1,2,3,4,5]
- 'k2':[1,2,3]
- 'k3':[1,2]
- }
- con = Q()
- for k,v in condition_dict:
- q = Q()
- q.connector = 'OR'
- for i in v:
- q.append(i)
- con.add(q,'AND')
- extra, 额外查询条件以及相关表,排序
- models.UserInfo.objects.filter(id__gt=1)
- models.UserInfo.objects.all()
- # id name age ut_id
- models.UserInfo.objects.extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
- # a. 映射
- # select
- # select_params=None
- # select 此处 from 表
- # b. 条件
- # where=None
- # params=None,
- # select * from 表 where 此处
- # c. 表
- # tables
- # select * from 表,此处
- # c. 排序
- # order_by=None
- # select * from 表 order by 此处
- models.UserInfo.objects.extra(
- select={'newid':'select count(1) from app01_usertype where id>%s'}, #newid是别名
- select_params=[1,], #替换%s
- where = ['age>%s'],
- params=[18,], #替换%s
- order_by=['-age'],
- tables=['app01_usertype']
- )
- #最终生成语句
- """
- select
- app01_userinfo.id,
- (select count(1) from app01_usertype where id>1) as newid
- from app01_userinfo,app01_usertype
- where
- app01_userinfo.age > 18
- order by
- app01_userinfo.age desc
- """
- result = models.UserInfo.objects.filter(id__gt=1).extra(
- where=['app01_userinfo.id < %s'],
- params=[100,],
- tables=['app01_usertype'],
- order_by=['-app01_userinfo.id'],
- select={'uid':1,'sw':"select count(1) from app01_userinfo"}
- )
- print(result.query)
- # SELECT (1) AS "uid", (select count(1) from app01_userinfo) AS "sw", "app01_userinfo"."id", "app01_userinfo"."name", "app01_userinfo"."age", "app01_userinfo"."ut_id" FROM "app01_userinfo" , "app01_usertype" WHERE ("app01_userinfo"."id" > 1 AND (app01_userinfo.id < 100)) ORDER BY ("app01_userinfo".id) DESC
- 原生SQL语句
- from django.db import connection, connections
- cursor = connection.cursor() # connection=default数据(默认数据库)
- cursor = connections['db2'].cursor() #第二个数据库
- cursor.execute("""SELECT * from auth_user where id = %s""", [1])
- row = cursor.fetchone()
- row = cursor.fetchall()
- - extra
- - 原生SQL语句
- - raw
- result = models.UserInfo.objects.raw('select * from userinfo')
- [obj(UserInfo),obj,]
- result = models.UserInfo.objects.raw('select id,1 as name,2 as age,4 as ut_id from usertype')
- [obj(UserInfo),obj,]
- v1 = models.UserInfo.objects.raw('SELECT id,title FROM app01_usertype',translations=name_map)
- ==========================补充1==========================
- # q = models.UserInfo.objects.all()
- # select * from userinfo
- # select * from userinfo inner join usertype on ...
- # for row in q:
- # print(row.name,row.ut.title) 正向操作连表查询
- # 性能优化
- # select_related: 查询主动做连表
- # q = models.UserInfo.objects.all().select_related('ut','gp') 括号里的是外键名
- # select * from userinfo
- # select * from userinfo inner join usertype on ...
- # for row in q:
- # print(row.name,row.ut.title)
- # 性能优化
- # prefetch_related: 不做连表,做多次查询
- # q = models.UserInfo.objects.all().prefetch_related('ut')
- # select * from userinfo;
- # Django内部:ut_id = [2,4]
- # select * from usertype where id in [2,4]
- # for row in q:
- # print(row.id,row.ut.title)
- ==========================补充2多对多操作==========================
- class Boy(models.Model):
- name = models.CharField(max_length=32)
- class Girl(models.Model):
- nick = models.CharField(max_length=32)
- class Love(models.Model):
- b = models.ForeignKey('Boy')
- g = models.ForeignKey('Girl')
- # 1. 和alex有关系的姑娘
- # obj = models.Boy.objects.filter(name='alex').first()
- # love_list = obj.love_set.all()
- # for row in love_list:
- # print(row.g.nick)
- #
- #
- # love_list = models.Love.objects.filter(b__name='alex')
- # for row in love_list:
- # print(row.g.nick)
- #性能优化
- # love_list = models.Love.objects.filter(b__name='alex').values('g__nick') #字典的形式
- # for item in love_list:
- # print(item['g__nick'])
- #
- # love_list = models.Love.objects.filter(b__name='alex').select_related('g')
- # for obj in love_list:
- # print(obj.g.nick)
- 1. ManyToManyField
- 2. 自定义关系表
- 3. 复合
- class Boy(models.Model):
- name = models.CharField(max_length=32)
- m = models.ManyToManyField('Girl',through="Love",through_fields=('b','g',))
- # 查询和清空
- class Girl(models.Model):
- nick = models.CharField(max_length=32)
- # m = models.ManyToManyField('Boy') # 自动生成第三张表
- class Love(models.Model):
- b = models.ForeignKey('Boy')
- g = models.ForeignKey('Girl')
- class Meta: # 联合唯一索引
- unique_together = [
- ('b','g'),
- ]
二、CSRF (跨站请求伪造)
- a. 基本应用
- form表单中添加
- {% csrf_token %}
- b. 全站禁用
- 去settings里边注释掉
- # 'django.middleware.csrf.CsrfViewMiddleware',
- c. 局部禁用
- 'django.middleware.csrf.CsrfViewMiddleware',
- from django.views.decorators.csrf import csrf_exempt
- @csrf_exempt
- def csrf1(request):
- if request.method == 'GET':
- return render(request,'csrf1.html')
- else:
- return HttpResponse('ok')
- d. 局部使用
- # 'django.middleware.csrf.CsrfViewMiddleware',
- from django.views.decorators.csrf import csrf_exempt,csrf_protect
- @csrf_protect
- def csrf1(request):
- if request.method == 'GET':
- return render(request,'csrf1.html')
- else:
- return HttpResponse('ok')
- c. 特殊CBV(在django的CBV中csrf只能加到类上边,不能加到类里边)
- from django.views import View
- from django.utils.decorators import method_decorator
- @method_decorator(csrf_protect,name='dispatch')
- class Foo(View):
- def get(self,request):
- pass
- def post(self,request):
- pass
- PS:CBV中添加装饰器
- def wrapper(func):
- def inner(*args,**kwargs):
- return func(*args,**kwargs)
- return inner
- # 1. 指定方法上添加装饰器
- # class Foo(View):
- #
- # @method_decorator(wrapper)
- # def get(self,request):
- # pass
- #
- # def post(self,request):
- # pass
- # 2. 在类上添加
- # @method_decorator(wrapper,name='dispatch')
- # class Foo(View):
- #
- # def get(self,request):
- # pass
- #
- # def post(self,request):
- # pass
- Ajax提交数据时候,携带CSRF:
- a. 放置在data中携带
- <form method="POST" action="/csrf1.html">
- {% csrf_token %}
- <input id="user" type="text" name="user" />
- <input type="submit" value="提交"/>
- <a onclick="submitForm();">Ajax提交</a>
- </form>
- <script src="/static/jquery-1.12.4.js"></script>
- <script>
- function submitForm(){
- var csrf = $('input[name="csrfmiddlewaretoken"]').val();
- var user = $('#user').val();
- $.ajax({
- url: '/csrf1.html',
- type: 'POST',
- data: { "user":user,'csrfmiddlewaretoken': csrf},
- success:function(arg){
- console.log(arg);
- }
- })
- }
- </script>
- b. 放在请求头中
- <form method="POST" action="/csrf1.html">
- {% csrf_token %}
- <input id="user" type="text" name="user" />
- <input type="submit" value="提交"/>
- <a onclick="submitForm();">Ajax提交</a>
- </form>
- <script src="/static/jquery-1.12.4.js"></script>
- <script src="/static/jquery.cookie.js"></script>
- <script>
- function submitForm(){
- var token = $.cookie('csrftoken');
- var user = $('#user').val();
- $.ajax({
- url: '/csrf1.html',
- type: 'POST',
- headers:{'X-CSRFToken': token},
- data: { "user":user},
- success:function(arg){
- console.log(arg);
- }
- })
- }
- </script>
django上课笔记3-ORM补充-CSRF (跨站请求伪造)的更多相关文章
- Django框架 之 基于Ajax中csrf跨站请求伪造
Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({ data: {csrfmiddlewaretoken: ...
- ajax向Django前后端提交请求和CSRF跨站请求伪造
1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...
- django 中间键 csrf 跨站请求伪造
django中间件和auth模块 Django中间件 由django的生命周期图我们可以看出,django的中间件就类似于django的保安,请求一个相应时要先通过中间件才能到达django后端( ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- Django中的CSRF(跨站请求伪造)
Django中的CSRF(跨站请求伪造) Django CSRF 什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...
- 十三 Django框架,CSRF跨站请求伪造
全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)
Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造) 摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...
随机推荐
- 【转载】云计算的三种服务模式:IaaS,PaaS和SaaS
一张图就看懂了.其他的都不用说了. 原文:http://blog.csdn.net/hjxgood/article/details/18363789
- UVA - 11178-Morley’s Theorem
就是给出一个等边三角形的三个顶点坐标 然后每一个角的三等分线会交错成一个三角形,求出这个三角形的顶点坐标 一開始.我题意理解错了--还以为是随意三角形,所以代码可以处理随意三角形的情况 我的做法: 通 ...
- 在canvas上面拖拽对象。
原文:https://html5.litten.com/how-to-drag-and-drop-on-an-html5-canvas/ 下面作者的原始的版本会抖动一下(鼠标刚点下去的时候,位置会发生 ...
- Android6.0权限管理以及使用权限该注意的地方
Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解.控 制 app 涉及到的权限.然而对开发人员来说却是一件比較蛋疼的事情.须要兼容适配,并保证程序功 ...
- 消息列队 分布式事务解办法 celery flower使用总结
前言 项目中有场景 需要用到 分布式事务业务,经过查下资料把学习相关笔记做记录方便他人或者自己后面查看. 场景 在网站A业务中有个操作 是 要在网站B中新建一台服务器跑业务.A中执行B中的接口创建服务 ...
- spring中构造函数注入
spring中构造函数注入,简单来说,就是通过beans.xml中,设置对应的值.而且通过bean类中的构造函数进行注入这些值. 文件结构 watermark/2/text/aHR0cDovL2Jsb ...
- TinyXML学习:TiXmlBase类
TiXmlBase: 作为整个TinyXML模型的基类,除了可以提供一些实用功能外,它几乎没有什么作用 TiXmlBase的友元类: friend class TiXmlNode; friend cl ...
- 【Java架构学习】Model1和Model2讨论
在Java的学习中.这两个词的频率出现的非常高.那就是Model1和Model2.那么到底什么是Model1,什么是Model2呢?我们是不是又非常自然接受这两个概念.可是不知道其所以然呢?今天我们就 ...
- ADO直接调用ACESS数据库MDB
1.ADO用ODBC链接不会出现堆栈溢出. 2.直接用ADO链接,因为对象不是NEW出来的,导致其成员变量也是栈上的,数组申请过大,栈溢出. 用VECTOR或者NEW对象,应该能解决.
- SpringBoot项目 部署到服务器的tomcat下
把spring-boot项目按照平常的web项目一样发布到tomcat容器下 一.修改pom文件 修改打包方式 修改或增加maven插件 注意: 二.移除嵌入式tomcat插件 三.添加servlet ...