django

1. CBV 源码剖析

# 注意: 轻易不要修改源码 出了bug很难找到# urls.py
url(r'^login/',views.MyLogin.as_view())'''
CBV和FBV在路由匹配上的本质是一样的 都是路由对应函数内存地址ps: 函数名/方法名 加上括号执行优先级最高as_view() 是被@classmethod修饰的类方法@classonlymethoddef as_view(cls, **initkwargs):...return view
'''
# as_view函数源码
@classonlymethod
def as_view(cls, **initkwargs):"""cls就是我们自己写的类Main entry point for a request-response process."""def view(request, *args, **kwargs):self = cls(**initkwargs)  # cls是我们自己写的类# self = MyLogin(**initkwargs)  产生一个我们自己写的类的对象return self.dispatch(request, *args, **kwargs)"""面向对象属性方法查找顺序先从对象自己找再去产生对象的类里面找之后再去父类找...总结: 看源码只要看到了self点一个东西 一定要问你自己当前这个self到底是谁"""return view# CBV 流程
1. 请求来了,路由匹配成功执行 path('index/', views.Index.as_view()),执行views.Index.as_view()(request)
2. 本质是执行as_view()内部有个闭包函数view(request)
3. 本质是view(request) => dispatch(request)
4. dispatch内部,根据请求的方法(get,post)=> 执行视图类中的 def get  def post
# views.pyclass Index(View):# 允许的请求方式列表# http_method_names = ['post', 'get']def dispatch(self, request, *args, **kwargs):# 执行原来的dispatch# 类似于装饰器# 加代码# res=super().dispatch(request, *args, **kwargs)# # 加代码# return res# 不管什么请求来,都执行getreturn self.get(request, *args, **kwargs)# 没有dispatch方法,找父类,如果有会执行自己的def get(self, request, *args, **kwargs):print(request.data)return HttpResponse('cbv的get请求')def post(self, request, *args, **kwargs):return HttpResponse('cbv的post请求')

2. 前后端交互编码方式

1. urlencoded => 传普通的数据(form表单默认)  request.POST
2. form-data  => 传文件和数据               request.POST   request.FILES
3. json       => 传json格式数据             request.body中取出来自行处理def index(request):# 接收urlencoded编码body体中:name=lqz&age=18# print(request.POST)# 接收form-data编码body体中:分两部分,一部分是数据,一部分是文件数据部分:name=lqz&age=18---asdfasdfasdfgasgasgd---文件部分:(二进制)# 数据部分# print(request.POST)# 文件部分# print(request.FILES)# 接收json格式body体中 {"name": "lqz","age": 18}# 这里没有print(request.POST)# 数据在这(自行处理)print(request.body)return HttpResponse('ok')

3. django 模板语法

1. django模板使用方式

# 模版语法重点:变量:{{ 变量名 }}1 深度查询 用句点符2 过滤器标签:{ %   % }

views.py

from django.template import Template,Contextdef index(request):# 第一种方式,最常用的now = datetime.datetime.now()return render(request,'time.html',context={'current_date':str(now),'title':'lqzNB'})# 第二种方式now=datetime.datetime.now()# t = Template('<html><body>现在时刻是:<h1>{{current_date}}</h1></body></html>')from day65 import settingsimport ospath=os.path.join(settings.BASE_DIR,'templates','time.html')print(path)ss=open(path,'r',encoding='utf-8').read()t=Template(ss)# t=get_template('current_datetime.html')c=Context({'current_date':str(now),'title':'lqzNB'})html=t.render(c)  # html是渲染后的字符串# 本质就是render(request,'home.html',context={'current_date':str(now)})return HttpResponse(html)

time.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ title }}</title>
</head>
<body>
现在时刻是:<h1>{{ current_date }}</h1>
</body>
</html>

2. 模板语法之变量

DTL: Django Template Language

在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法:{{变量名}}

views.py

模板中使用 {{ python变量 }}def index(request):num = 10ss = 'lqz is handsome'b = Falsell = [1, 2, 43]dic = {'name': 'lqz', 'age': 18}def test():print('我是test')return 'test ---撒发射点'class Person():def __init__(self, name):self.name = namedef print_name(self):return self.namedef __str__(self):return self.namep=Person('lqz')# return render(request, 'index.html',{'num':num,'ss':ss,'b':b})# locals() 把当前作用域下所有的变量,都传到context中return render(request, 'index.html',locals())

index.html

# index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ss}}</title>
</head>
<body><h1>模板语法之变量</h1><p>数字:{{ num }}</p>
<p>字符串:{{ ss }}</p>
<p>布尔:{{ b }}</p>
<p>列表:{{ ll }}</p>
<p>字典:{{ dic }}</p>
<p>函数:{{ test }}</p>
<p>对象:{{ p }}</p></body>
</html>

3. 模板语法之深度查询句点符

views.py

def index(request):num = 10ss = 'lqz is handsome'b = Falsell = [1, 2, 43, {'name': 'egon'}]dic = {'name': 'lqz', 'age': 18}def test():print('我是test')return 'test ---撒发射点'class Person():def __init__(self, name):self.name = namedef print_name(self):return self.namedef __str__(self):return self.namep = Person('lqz')link1 = '<a href="https://www.baidu.com">点我<a>'link2 = mark_safe(link1)input_1='<p>用户名:<input type="text" name="name"></p>'input_2=mark_safe(input_1)script_1='''<script>alert('你被攻击了')</script>'''script_2 =mark_safe(script_1)return render(request, 'index.html', locals())

index.html

<h2>模板语法之句点符的深度查询</h2>
<p>列表的第一个元素:{{ ll.0 }}</p>
<p>字典的name对应的值:{{ dic.name }}</p>
<p>列表的第三个元素的name对应的值:{{ ll.2.name }}</p>
<p>函数执行,直接写函数名即可:{{ test }}</p>
<p>函数如果有参数?不支持</p>
<p>对象调用方法: {{ p.print_name }}</p>
<p>对象调用属性: {{ p.name }}</p>
<hr>
<a href="https://www.baidu.com">点我</a>
<p>a标签的字符串: {{ link1 }}</p>
<p>a标签的字符串,显示成a标签: {{ link2 }}</p><p>用户名:<input type="text" name="name"></p>
<p>input标签:{{ input_1 }}</p>
<p>input标签,显示成标签:{{ input_2 }}</p><p>js原封不动显示:{{ script_1 }}</p>
{{ script_2 }}# 补充
from django.utils.safestring import mark_safelink1 = '<a href="https://www.baidu.com">点我<a>'
link2 = mark_safe(link1){link1|safe}

4. 模板过滤器

default,length,filesizeformat,date,slice,truncatechars,safe

index.html

1. {{ 参数1|过滤器名字: 参数2 }}
2. 过滤器最多传两个值,最少一个值  {{ 'lqz is'|slice: '2:3' }}<h1>过滤器</h1><p>过滤器之default:{{ num|default:'没有值' }}</p>
<p>过滤器之length:{{ ll|length }}</p>
<p>过滤器之length:{{ dic|length }}</p>
<p>过滤器之length:{{ 'das'|length }}</p>{#  模板语法的注释  #}# 了解
<p>过滤器之filesizeformat:{{ num|filesizeformat }}</p># lqz is handsome
<p>过滤器之slice:{{ ss|slice:"7:11" }}</p># 第二个参数写0,1,2, 都是 ...,  最少从3开始
<p>过滤器之truncatechars:{{ ss|truncatechars:'30' }}</p>
<p>truncatewords:{{ ss|truncatewords:'2' }}</p># 记住
<p>过滤器之date:{{ ctime|date:'Y年m月d日-------H时i分s秒' }}</p>
<p>过滤器之safe:{{ link1|safe }}</p>

5. 模板标签

for,for … empty,if,with,csrf_token

标签语法: { % tag % }

标签比变量更加复杂:

​ 一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。一些标签需要开始和结束标签 (例如 {% tag %} … 标签 内容 … {% endtag %})

for标签

遍历每一个元素:

{% for person in person_list %}<p>{{ person.name }}</p>
{% endfor %}

可以利用{% for obj in list reversed %}反向完成循环

遍历一个字典:

{% for key,val in dic.items %}<p>{{ key }}:{{ val }}</p>
{% endfor %}

注:循环序号可以通过{{ forloop }}显示

forloop.counter            The current iteration of the loop (1-indexed) 当前循环的索引值(从1开始)forloop.counter0           The current iteration of the loop (0-indexed) 当前循环的索引值(从0开始)forloop.revcounter         The number of iterations from the end of the loop (1-indexed) 当前循环的倒序索引值(从1开始)forloop.revcounter0        The number of iterations from the end of the loop (0-indexed) 当前循环的倒序索引值(从0开始)forloop.first              True if this is the first time through the loop 当前循环是不是第一次循环(布尔值)forloop.last               True if this is the last time through the loop 当前循环是不是最后一次循环(布尔值)forloop.parentloop         本层循环的外层循环

for … empty

for标签带有一个可选的{% empty %}从句,以便在给出的组是空的或者没有被找到时,可以有所操作。

{% for person in person_list %}<p>{{ person.name }}</p>{% empty %}<p>sorry,no person here</p>
{% endfor %}

if 标签

{% if %} 会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。

{% if num > 100 or num < 0 %}<p>无效</p>
{% elif num > 80 and num < 100 %}<p>优秀</p>
{% else %}<p>凑活吧</p>
{% endif %}

if 语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

with标签

使用一个简单地名字缓存一个复杂的变量

当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的

{% with total=business.employees.count %}{{ total }} employee{{ total|pluralize }}
{% endwith %}

csrf_token标签

{% csrf_token%}

这个标签用于跨站请求伪造保护

views.py

# views.py
def index(request):ll=['lqz','egon','zs','ls','ww']# ll=[]dic={'name':'lqz','age':19}count=1lqzisnbplus='lqz'# b=Falseb=Trueuser_list=[{'name':'lqz','age':19},{'name':'egon','age':18},{'name':'张三','age':22},{'name':'李四','age':99},{'name':'asdfasdf','age':18},{'name':'暗室逢灯n','age':18}]return render(request, 'index.html', locals())

index.html

<h1>模板语法之标签</h1><h2>for的用法</h2>
{% for l in ll %}{# <p>{{ l }}</p> #}<p><a href="http://127.0.0.1:8080/{{ l }}">{{ l }}</a></p>
{% endfor %}<hr>
{% for k,v in dic.items %}<p>key值为:{{ k }},value值为{{ v }}</p>
{% endfor %}<table border="1"><tr><td>id号</td><td>用户名</td><td>年龄</td></tr>{% for dic in user_list %}<tr><td>{{ forloop.counter }}</td><td>{{ dic.name }}</td><td>{{ dic.age }}</td></tr>{% endfor %}
</table><h2>for...empty的用法</h2>
<ul>{% for l in ll %}<li>{{ l }}</li>{% empty %}<li>没有数据</li>{% endfor %}
</ul><h2>forloop对象</h2>
{% for dic in user_list %}{% for key,value in dic.items %}{{ forloop.parentloop.counter }}<p>{{ key }}:{{ value }}</p>{% endfor %}
{% endfor %}<h2>if</h2>
{% if b %}<p>b是true的</p>
{% else %}<p>b是false的</p>
{% endif %}<h2>with重命名</h2>
{% with forloop.parentloop.counter as aaa %}{{ aaa }}
{% endwith %}{% with lqzisnbplus as a %}
{{ a }}
{{ lqzisnbplus }}
{% endwith %}<h2>csrf</h2>
{% csrf_token %}
<input type="text" name="csrfmiddlewaretoken" value="uC35XuP1J2Va74ArYiNw4TMZ0PaZ6V4qvVGCsUQcqiKF5Sr8IrWS0rzpmOmPBrjY">
</body>

python-django前端传递数据的三种格式_CBV源码分析_django模板语法相关推荐

  1. python Django之 DRF(一)框架介绍、源码分析

    文章目录 一.django rest framework 框架的介绍 1.什么是RESTful规范? 2.RESTful API的介绍 二.drf框架源码解读 1.drf框架的使用 2.APIView ...

  2. 创建线程的三种方法_Netty源码分析系列之NioEventLoop的创建与启动

    前言 前三篇文章分别分析了 Netty 服务端 channel 的初始化.注册以及绑定过程的源码,理论上这篇文章应该开始分析新连接接入过程的源码了,但是在看源码的过程中,发现有一个非常重要的组件:Ni ...

  3. python csv库,Python 中导入csv数据的三种方法

    Python 中导入csv数据的三种方法,具体内容如下所示: 1.通过标准的Python库导入CSV文件: Python提供了一个标准的类库CSV文件.这个类库中的reader()函数用来导入CSV文 ...

  4. Ajax响应处理数据的三种格式(主要使用gson包)

    Ajax响应处理数据的三种格式 A.普通文本(重点)后台:sevletresp.getWriter().print("Ajax响应成功");前台:jspvar text= xhr. ...

  5. hibernate 三种查询方式源码跟踪及总结

    1.设置环境(以EClipse和hibernate 3.2.6为例) 1)首先,新建一个java 工程. 2) 将hiberante src导入到java的src目录下,此时多半会报错,不用管它! 3 ...

  6. Nginx/Openresty日志时间显示到毫秒级的三种方法(不改源码)

    Nginx/Openresty日志时间显示到毫秒级的三种方法(不改源码) 方法一 :set (只能在server节点内) 方法二: set_by_lua (只能在server节点内) 方法三: map ...

  7. 深入java并发包源码(三)AQS独占方法源码分析

    深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...

  8. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    阅读目录 一.Django请求生命周期: 二.WEB开发模式: 三.cbv源码分析: 四.认识RESTful 补充知识:跨域 五.基于原生django开发restful的接口 六.drf安装.使用.A ...

  9. tensorflow入门教程(三十五)facenet源码分析之MTCNN--人脸检测及关键点检测

    # #作者:韦访 #博客:https://blog.csdn.net/rookie_wei #微信:1007895847 #添加微信的备注一下是CSDN的 #欢迎大家一起学习 # ------韦访 2 ...

  10. 在参考了众多博客之后,我写出了多达三万字的HashMap源码分析,比我本科毕业论文都要精彩

    HashMap源码分析 以下代码都是基于java8的版本 HashMap简介 源码: public class HashMap<K,V> extends AbstractMap<K, ...

最新文章

  1. [转载]SQL注入***之 mysql_set_charset(版本要求p
  2. Mybatis Generator的使用
  3. hdu4950 打怪(简单题目)
  4. C#中使用SharpZipLib进行解压缩并使用ProtoBuf进行反序列化
  5. Chrome和Firefox中安装Hackbar插件
  6. 云服务器可以安装操作系统么,云服务器安装操作系统吗
  7. Metasploit Framework(MSF)的使用
  8. Xcode的SVN提示The request timed out.的解决方案
  9. linux添加三权,基于SELinux的三权分离技术的研究
  10. 页面错误!请稍后再试_微信内嵌H5页面授权和分享
  11. 华中科技大学计算机视觉张朋,管涛-华中科技大智能媒体计算与网络安全实验室...
  12. ElasticSearch的搜索推荐(typeahead)
  13. 相机java程序_以编程方式在Android上用相机拍照
  14. 高中数学竞赛书籍推荐
  15. 人人商城小程序下单付款报错:“服务器暂时无法处理您的请求,请稍后再试”
  16. 基于STM32的手势识别检测
  17. ar 华为路由器 端口映射_华为AR1220-S路由器WEB界面鸡肋使用命令映射多端口方法...
  18. 伊利诺伊大学在线计算机硕士,UIUC伊利诺伊大学厄巴纳香槟分校计算机科学硕士MSc in Computer Science...
  19. Android开发中App演示Gif效果动画的制作过程详讲
  20. python血脉贲张的cosplay小姐姐图片

热门文章

  1. MOS管(场效应管)导通条件
  2. win10修改dns服务器命令,Win10怎么更改首选DNS服务器地址?
  3. Multispectral Deep Neural Networks for Pedestrian Detection(BMVC 2016)论文解读
  4. 超简单的Spring入门案例制作,快来看看吧!
  5. JAVA代码重复率多少达标_【案例】代码重复率太高不要怕,求真老师教你化险为夷!...
  6. 攻克拖延症——经历记录与心得分享
  7. VMware虚拟机安装黑苹果步骤与常见问题,VMware16,MacOS12.01(Moterey)
  8. GetAdaptersInfo获取网卡信息
  9. 页面加载出现白页是什么原因造成的
  10. Mac上word无响应且内容未保存后强制退出后恢复内容方法