一、ORM补充

  1. ORM操作三大难点:
  2. 正向操作反向操作连表
  3. 其它基本操作(包含F Q extra)
  4. 性能相关的操作
  5. class UserInfo(models.Model):
  6. uid = models.BigAutoField(primary_key=True)
  7. username = models.CharField(max_length=32)
  8. passwd = models.CharField(max_length=64)
  9. age = models.ImageField(null=True) 插入一列,可以为空值
  10. ug = models.ForeignKey('UserGroup',null=True)
  11.  
  12. def __str__(self):
  13. return self.name
  14. views.py的视图函数里查询数据时可以直接看到具体的名字信息并且根据了uid排序
  15. userinfo_list = models.UserInfo.objects.all().order_by('uid')
  16.  
  17. views.py的视图函数里
  18. from django.db.models import Count,Sum,Max,Min
  19. # values里面的字符串是根据什么group by , A是聚合条件的别名, Count里的是聚合条件,filter(A__gt=2)相当于having
  20. v = models.UserInfo.objects.values('ut_id').annotate(A=Count('uid'))
  21. print(v.jquery)
  22. v = models.UserInfo.objects.values('ut_id').annotate(A=Count('uid')).filter(A__gt=2)
  23.  
  24. F , Q , extra
  25.  
  26. from django.db.models import F,Q,extra
  27. F,更新时用于获取原来的值
  28. models.UserInfo.objects.all().update(age=F(age+1)) #让数据库里所有的age+1
  29.  
  30. models.UserInfo.objects.all().filter(id=1,name='root') #多个条件之间的关系是and关系
  31.  
  32. Q,用于构造复杂查询条件
  33. models.UserInfo.objects.all().filter(Q(id=1) | Q(name='root')) # Q里边是or条件
  34.  
  35. q1 = Q() #生成q1对象
  36. q1.connector = 'OR' #q1里3个条件的关系是or
  37. q1.children.append(('uid',1))
  38. q1.children.append(('uid',3))
  39. q1.children.append(('uid',5))
  40.  
  41. q2 = Q() #生成q2对象
  42. q2.connector = 'OR' #q2里3个条件的关系是or
  43. q2.children.append(('age',1))
  44. q2.children.append(('age',3))
  45. q2.children.append(('age',5))
  46.  
  47. con = Q() #生成con对象 con里边2个条件的关系是and
  48. con.add(q1,'AND')
  49. con.add(q2,'AND')
  50.  
  51. 动态生成Q
  52. condition_dict = {
  53. 'k1':[1,2,3,4,5]
  54. 'k2':[1,2,3]
  55. 'k3':[1,2]
  56. }
  57. con = Q()
  58. for k,v in condition_dict:
  59. q = Q()
  60. q.connector = 'OR'
  61. for i in v:
  62. q.append(i)
  63. con.add(q,'AND')
  64.  
  65. extra, 额外查询条件以及相关表,排序
  66.  
  67. models.UserInfo.objects.filter(id__gt=1)
  68. models.UserInfo.objects.all()
  69. # id name age ut_id
  70.  
  71. models.UserInfo.objects.extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
  72. # a. 映射
  73. # select
  74. # select_params=None
  75. # select 此处 from 表
  76.  
  77. # b. 条件
  78. # where=None
  79. # params=None,
  80. # select * from 表 where 此处
  81.  
  82. # c. 表
  83. # tables
  84. # select * from 表,此处
  85.  
  86. # c. 排序
  87. # order_by=None
  88. # select * from 表 order by 此处
  89.  
  90. models.UserInfo.objects.extra(
  91. select={'newid':'select count(1) from app01_usertype where id>%s'}, #newid是别名
  92. select_params=[1,], #替换%s
  93. where = ['age>%s'],
  94. params=[18,], #替换%s
  95. order_by=['-age'],
  96. tables=['app01_usertype']
  97. )
  98. #最终生成语句
  99. """
  100. select
  101. app01_userinfo.id,
  102. (select count(1) from app01_usertype where id>1) as newid
  103. from app01_userinfo,app01_usertype
  104. where
  105. app01_userinfo.age > 18
  106. order by
  107. app01_userinfo.age desc
  108. """
  109.  
  110. result = models.UserInfo.objects.filter(id__gt=1).extra(
  111. where=['app01_userinfo.id < %s'],
  112. params=[100,],
  113. tables=['app01_usertype'],
  114. order_by=['-app01_userinfo.id'],
  115. select={'uid':1,'sw':"select count(1) from app01_userinfo"}
  116. )
  117. print(result.query)
  118. # 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
  119.  
  120. 原生SQL语句
  121.  
  122. from django.db import connection, connections
  123.  
  124. cursor = connection.cursor() # connection=default数据(默认数据库)
  125. cursor = connections['db2'].cursor() #第二个数据库
  126.  
  127. cursor.execute("""SELECT * from auth_user where id = %s""", [1])
  128.  
  129. row = cursor.fetchone()
  130. row = cursor.fetchall()
  131.  
  132. - extra
  133. - 原生SQL语句
  134. - raw
  135. result = models.UserInfo.objects.raw('select * from userinfo')
  136. [obj(UserInfo),obj,]
  137. result = models.UserInfo.objects.raw('select id,1 as name,2 as age,4 as ut_id from usertype')
  138. [obj(UserInfo),obj,]
  139.  
  140. v1 = models.UserInfo.objects.raw('SELECT id,title FROM app01_usertype',translations=name_map)
  141. ==========================补充1==========================
  142. # q = models.UserInfo.objects.all()
  143. # select * from userinfo
  144. # select * from userinfo inner join usertype on ...
  145. # for row in q:
  146. # print(row.name,row.ut.title) 正向操作连表查询
  147.  
  148. # 性能优化
  149. # select_related: 查询主动做连表
  150. # q = models.UserInfo.objects.all().select_related('ut','gp') 括号里的是外键名
  151. # select * from userinfo
  152. # select * from userinfo inner join usertype on ...
  153. # for row in q:
  154. # print(row.name,row.ut.title)
  155.  
  156. # 性能优化
  157. # prefetch_related: 不做连表,做多次查询
  158. # q = models.UserInfo.objects.all().prefetch_related('ut')
  159. # select * from userinfo;
  160. # Django内部:ut_id = [2,4]
  161. # select * from usertype where id in [2,4]
  162. # for row in q:
  163. # print(row.id,row.ut.title)
  164.  
  165. ==========================补充2多对多操作==========================
  166. class Boy(models.Model):
  167. name = models.CharField(max_length=32)
  168.  
  169. class Girl(models.Model):
  170. nick = models.CharField(max_length=32)
  171.  
  172. class Love(models.Model):
  173. b = models.ForeignKey('Boy')
  174. g = models.ForeignKey('Girl')
  175.  
  176. # 1. 和alex有关系的姑娘
  177. # obj = models.Boy.objects.filter(name='alex').first()
  178. # love_list = obj.love_set.all()
  179. # for row in love_list:
  180. # print(row.g.nick)
  181. #
  182. #
  183. # love_list = models.Love.objects.filter(b__name='alex')
  184. # for row in love_list:
  185. # print(row.g.nick)
  186.  
  187. #性能优化
  188. # love_list = models.Love.objects.filter(b__name='alex').values('g__nick') #字典的形式
  189. # for item in love_list:
  190. # print(item['g__nick'])
  191. #
  192. # love_list = models.Love.objects.filter(b__name='alex').select_related('g')
  193. # for obj in love_list:
  194. # print(obj.g.nick)
  195.  
  196. 1. ManyToManyField
  197.  
  198. 2. 自定义关系表
  199.  
  200. 3. 复合
  201.  
  202. class Boy(models.Model):
  203. name = models.CharField(max_length=32)
  204. m = models.ManyToManyField('Girl',through="Love",through_fields=('b','g',))
  205. # 查询和清空
  206.  
  207. class Girl(models.Model):
  208. nick = models.CharField(max_length=32)
  209. # m = models.ManyToManyField('Boy') # 自动生成第三张表
  210.  
  211. class Love(models.Model):
  212. b = models.ForeignKey('Boy')
  213. g = models.ForeignKey('Girl')
  214.  
  215. class Meta: # 联合唯一索引
  216. unique_together = [
  217. ('b','g'),
  218. ]

二、CSRF (跨站请求伪造)

  1. a. 基本应用
  2. form表单中添加
  3. {% csrf_token %}
  4.  
  5. b. 全站禁用
  6. settings里边注释掉
  7. # 'django.middleware.csrf.CsrfViewMiddleware',
  8.  
  9. c. 局部禁用
  10. 'django.middleware.csrf.CsrfViewMiddleware',
  11.  
  12. from django.views.decorators.csrf import csrf_exempt
  13.  
  14. @csrf_exempt
  15. def csrf1(request):
  16.  
  17. if request.method == 'GET':
  18. return render(request,'csrf1.html')
  19. else:
  20. return HttpResponse('ok')
  21.  
  22. d. 局部使用
  23. # 'django.middleware.csrf.CsrfViewMiddleware',
  24.  
  25. from django.views.decorators.csrf import csrf_exempt,csrf_protect
  26.  
  27. @csrf_protect
  28. def csrf1(request):
  29.  
  30. if request.method == 'GET':
  31. return render(request,'csrf1.html')
  32. else:
  33. return HttpResponse('ok')
  34.  
  35. c. 特殊CBV(在djangoCBVcsrf只能加到类上边,不能加到类里边)
  36. from django.views import View
  37. from django.utils.decorators import method_decorator
  38.  
  39. @method_decorator(csrf_protect,name='dispatch')
  40. class Foo(View):
  41.  
  42. def get(self,request):
  43. pass
  44.  
  45. def post(self,request):
  46. pass
  47.  
  48. PSCBV中添加装饰器
  49. def wrapper(func):
  50. def inner(*args,**kwargs):
  51. return func(*args,**kwargs)
  52. return inner
  53. # 1. 指定方法上添加装饰器
  54.  
  55. # class Foo(View):
  56. #
  57. # @method_decorator(wrapper)
  58. # def get(self,request):
  59. # pass
  60. #
  61. # def post(self,request):
  62. # pass
  63. # 2. 在类上添加
  64. # @method_decorator(wrapper,name='dispatch')
  65. # class Foo(View):
  66. #
  67. # def get(self,request):
  68. # pass
  69. #
  70. # def post(self,request):
  71. # pass
  72.  
  73. Ajax提交数据时候,携带CSRF
  74. a. 放置在data中携带
  75.  
  76. <form method="POST" action="/csrf1.html">
  77. {% csrf_token %}
  78. <input id="user" type="text" name="user" />
  79. <input type="submit" value="提交"/>
  80. <a onclick="submitForm();">Ajax提交</a>
  81. </form>
  82. <script src="/static/jquery-1.12.4.js"></script>
  83. <script>
  84. function submitForm(){
  85. var csrf = $('input[name="csrfmiddlewaretoken"]').val();
  86. var user = $('#user').val();
  87. $.ajax({
  88. url: '/csrf1.html',
  89. type: 'POST',
  90. data: { "user":user,'csrfmiddlewaretoken': csrf},
  91. success:function(arg){
  92. console.log(arg);
  93. }
  94. })
  95. }
  96.  
  97. </script>
  98.  
  99. b. 放在请求头中
  100.  
  101. <form method="POST" action="/csrf1.html">
  102. {% csrf_token %}
  103. <input id="user" type="text" name="user" />
  104. <input type="submit" value="提交"/>
  105. <a onclick="submitForm();">Ajax提交</a>
  106. </form>
  107. <script src="/static/jquery-1.12.4.js"></script>
  108. <script src="/static/jquery.cookie.js"></script>
  109.  
  110. <script>
  111. function submitForm(){
  112. var token = $.cookie('csrftoken');
  113. var user = $('#user').val();
  114. $.ajax({
  115. url: '/csrf1.html',
  116. type: 'POST',
  117. headers:{'X-CSRFToken': token},
  118. data: { "user":user},
  119. success:function(arg){
  120. console.log(arg);
  121. }
  122. })
  123. }
  124. </script>

django上课笔记3-ORM补充-CSRF (跨站请求伪造)的更多相关文章

  1. Django框架 之 基于Ajax中csrf跨站请求伪造

    Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: ...

  2. ajax向Django前后端提交请求和CSRF跨站请求伪造

    1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...

  3. django 中间键 csrf 跨站请求伪造

    django中间件和auth模块   Django中间件 由django的生命周期图我们可以看出,django的中间件就类似于django的保安,请求一个相应时要先通过中间件才能到达django后端( ...

  4. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  5. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  6. Django中的CSRF(跨站请求伪造)

    Django中的CSRF(跨站请求伪造) Django CSRF  什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...

  7. 十三 Django框架,CSRF跨站请求伪造

     全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...

  8. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  9. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

随机推荐

  1. 【转载】云计算的三种服务模式:IaaS,PaaS和SaaS

    一张图就看懂了.其他的都不用说了. 原文:http://blog.csdn.net/hjxgood/article/details/18363789

  2. UVA - 11178-Morley’s Theorem

    就是给出一个等边三角形的三个顶点坐标 然后每一个角的三等分线会交错成一个三角形,求出这个三角形的顶点坐标 一開始.我题意理解错了--还以为是随意三角形,所以代码可以处理随意三角形的情况 我的做法: 通 ...

  3. 在canvas上面拖拽对象。

    原文:https://html5.litten.com/how-to-drag-and-drop-on-an-html5-canvas/ 下面作者的原始的版本会抖动一下(鼠标刚点下去的时候,位置会发生 ...

  4. Android6.0权限管理以及使用权限该注意的地方

    Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解.控 制 app 涉及到的权限.然而对开发人员来说却是一件比較蛋疼的事情.须要兼容适配,并保证程序功 ...

  5. 消息列队 分布式事务解办法 celery flower使用总结

    前言 项目中有场景 需要用到 分布式事务业务,经过查下资料把学习相关笔记做记录方便他人或者自己后面查看. 场景 在网站A业务中有个操作 是 要在网站B中新建一台服务器跑业务.A中执行B中的接口创建服务 ...

  6. spring中构造函数注入

    spring中构造函数注入,简单来说,就是通过beans.xml中,设置对应的值.而且通过bean类中的构造函数进行注入这些值. 文件结构 watermark/2/text/aHR0cDovL2Jsb ...

  7. TinyXML学习:TiXmlBase类

    TiXmlBase: 作为整个TinyXML模型的基类,除了可以提供一些实用功能外,它几乎没有什么作用 TiXmlBase的友元类: friend class TiXmlNode; friend cl ...

  8. 【Java架构学习】Model1和Model2讨论

    在Java的学习中.这两个词的频率出现的非常高.那就是Model1和Model2.那么到底什么是Model1,什么是Model2呢?我们是不是又非常自然接受这两个概念.可是不知道其所以然呢?今天我们就 ...

  9. ADO直接调用ACESS数据库MDB

    1.ADO用ODBC链接不会出现堆栈溢出. 2.直接用ADO链接,因为对象不是NEW出来的,导致其成员变量也是栈上的,数组申请过大,栈溢出. 用VECTOR或者NEW对象,应该能解决.

  10. SpringBoot项目 部署到服务器的tomcat下

    把spring-boot项目按照平常的web项目一样发布到tomcat容器下 一.修改pom文件 修改打包方式 修改或增加maven插件 注意: 二.移除嵌入式tomcat插件 三.添加servlet ...