2020-10-12

Django——模版层(前后端交互编码方式,django模板使用的两种方式,模板语法之变量深度查询句点符,模板渲染成标签还是原字符串,过滤器+自定义,标签+自定义)

一、前后端交互编码方式

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

二、django模板使用的两种方式

# 方式一return render(request,'time.html',context={'current_date':str(now),'title':'lqzNB'})# 方式二(页面静态化,提高网站并发量) now=datetime.datetime.now() from day65 import settings import os path=os.path.join(settings.BASE_DIR,'templates','time.html') ss=open(path,'r',encoding='utf-8').read() t=Template(ss) c=Context({'current_date':str(now),'title':'lqzNB'}) html=t.render(c) # html是渲染后的字符串 return HttpResponse(html)

三、模板语法之变量

DTL:Django Template Language  (django模板语言)

#views.py

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

四、模板语法之深度查询句点符

# views.py

def index(request): num = 10 ss = 'lqz is handsome' b = False ll = [1, 2, 43, {'name': 'egon'}] dic = {'name': 'lqz', 'age': 18} def test():  print('我是test')  return 'test ---撒发射点' class Person():  def __init__(self, name):   self.name = name  def print_name(self):   return self.name  def __str__(self):   return self.name p = 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.1 }}</p><p>字典的name对应的值:{{ dic.name }}</p><p>列表的第三个元素的name对应的值:{{ ll.3.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 }}

五、显示的是模板渲染成标签还是原封不动的字符串

# 这里是出现xss攻击的地方
# xss攻击:是什么,如何预防?django已经处理了xss攻击,它的处理原理是什么from django.utils.safestring import mark_safelink1 = '<a href="https://www.baidu.com">点我<a>'<!--方式一:-->link2 = mark_safe(link1)<!--方式二:-->{link1|safe}

六、过滤器

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

1 {{参数1|过滤器名字:参数2}}2 过滤器最多传两个值,最少一个值 {{'lqz is'|slice:'2:3'}}# 了解<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>

七、自定义过滤器

 

自定义过滤器 -第一步:在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag -第二步:在app中创建templatetags包(包名只能是templatetags,不能改) -第三步:在包内,新建py文件(如:my_tags.py) -第四步:写代码(过滤器)  from django import template  register = template.Library()  @register.filter  def my_upper(value):   return value.upper() -第五步使用:(模板),先load,再使用  {% load my_tags %}  {{ 'aa'|my_upper }}

 

八、标签

for,for ... empty,if,with,csrf_token

1 {% 标签名 %}2 标签for ,在标签for的内部一直有一个forloop对象,是个字典counter0:从0开始,每循环一次加1counter:从1开始,每循环一次加1revcounter:从列表长度开始,每循环一次减一first:判断是不是循环的第一个last:判断是不是循环的最后一个parentloop:父级forloop对象(for循环嵌套){'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 6, 'revcounter0': 5, 'first': True, 'last': False}3 if标签4 with标签(了解)5 csrf标签(了解)

#views.py

def index(request): ll=['lqz','egon','zs','ls','ww'] # ll=[] dic={'name':'lqz','age':19} count=1 lqzisnbplus='lqz' # b=False b=True user_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><hr><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>

九、自定义标签

自定义标签 -第一步:在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag -第二步:在app中创建templatetags包(包名只能是templatetags,不能改) -第三步:在包内,新建py文件(如:my_tags.py) -第四步:写代码(过滤器)  from django import template  register = template.Library()  @register.simple_tag  def my_csrf():   import uuid   res=uuid.uuid4()   return mark_safe('<input type="hidden" name="csrfmiddlewaretoken" value="%s">'%res) -第五步使用:(模板),先load,再使用  {% load my_tags %}  {% my_csrf %}  {% my_tag 1 3 4 %} 

 

原文转载:http://www.shaoqun.com/a/480991.html

心怡科技:https://www.ikjzd.com/w/1327

aeo:https://www.ikjzd.com/w/2356

盘古集团:https://www.ikjzd.com/w/1448


一、前后端交互编码方式1urlencoded---->传普通的数据,form表单默认就是这种---->request.POST2form-data-----》传文件和数据---->request.POSTrequest.FILES3json----------》传json格式数据---->request.body中取出来自行处理defindex(request):#接收ur
东西网:https://www.ikjzd.com/w/1238
csa认证:https://www.ikjzd.com/w/904
客户剖析表:https://www.ikjzd.com/tl/107376
1000块就买了你的品牌!亚马逊内部消息曝光:https://www.ikjzd.com/home/20280
Shopee买家退货退款?COD不取怎么办?:https://www.ikjzd.com/home/101090

No comments:

Post a Comment