模板層
阿新 • • 發佈:2018-09-07
safe 24* 特殊 如果 輸入 前端 tor eat locals
filter {{}} 1 變量 1 句點符,深度查詢 2 可以點到方法,不要加括號,只能是無參的方法 3 xss跨站腳本攻擊: 比如提交評論<script>alert(‘dsb‘)</script> 存到數據庫 響應到html 瀏覽器解釋 就會彈窗 如果for循環一千次或者多次 頁面就崩了 這就是xss攻擊 所以一定要處理 如果不要django處理(比如:<用> 替換) 就要顯示標簽可以這樣處理: 1 ss3=mark_safe(ss3) fromdjango.utils.safestring import mark_safe 在views中 2 <p>safe過濾器: {{ ss3|safe }}</p> html中
3 @register.simple_tag(is_safe=False) 默認是true,防止xss攻擊,顯示字符串。false瀏覽器直接解釋標簽 自定義標簽時設置false 2 過濾器 冒號後不能加空格 now是第一個參數,冒號後面是第二個參數<p>date過濾器 {{ now|date:‘Y-m-d:H:i:s‘ }}</p> <p>date過濾器 {{ now|date }}</p> 如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如: <p>default過濾器 {{ ss2|default:‘字符串沒有值‘ }}</p> <p>default過濾器 {{ ll3|default:‘列表沒有值‘ }}</p> 返回值的長度。它對字符串和列表都起作用<p>length過濾器 {{ ll2|length }}</p> 將值格式化為一個 “人類可讀的” 文件尺寸 單位是B (例如 ‘13 KB‘, ‘4.1 MB‘, ‘102 bytes‘, 等等)。例如: <p>filesizeformat過濾器 {{ file|filesizeformat }}</p> <p>filesizeformat過濾器 {{ 1024|filesizeformat }}</p> 切片操作 <p>slice過濾器 {{ ‘lqzisbig‘|slice:‘1:9‘ }}</p> 如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾 帶空格的字符串不算點的數量 不帶空格的字符串算點的數量 <p>truncatechars過濾器 {{ ‘lqzisbigdddddddeee‘|truncatechars:9 }}</p> <p>truncatewords過濾器: {{ ‘lqz is big and egon is small‘|truncatewords:3 }}</p xss攻擊:跨站腳本攻擊 1 在html中處理 <p>safe過濾器: {{ ss3|safe }}</p> 2 {#也可以在視圖函數裏處理#} from django.utils.safestring import mark_safe ss3=mark_safe(ss3) 倆參數可以傳字符串和數字,具體詳見源碼 <p>add過濾器: {{ 12|add:"3" }}</p> <p>add過濾器: {{ ‘eee‘|add:"3rrr" }}</p> tag {% %} for :forloop {%for i in ll%} #必須再for循環裏使用 {{forloop}} 字典 # {% empty%}} 判斷是否為空 {% endfor%} if if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。 {%if 條件%} {% endif%} {% with aa=dic.name%} 起別名 {{aa}} {%endwith%} 自定義過濾器 1 先去setting裏面把app名字配置上 2 再app目錄下創建一個templatetags模塊 3 寫py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 寫函數 addstr(用register.filter()裝飾) 7 模板: 8 {% load my_test %} 9 {{‘lqz‘|addstr:‘isbig‘ }} #最多只能傳兩個參數 自定義標簽: settings app01-templatetags-my_test.py 1 先去setting裏面把app名字配置上 (除非新加的一般都是弄好的) 2 再app目錄下創建一個templatetags模塊 3 寫py文件(my_test.py) 4 from django import template 5 register=template.Library() 6 寫函數 [email protected]_tag(name=‘yy‘)裝飾) @register.simple_tag(name=‘yy‘) def my_sum(x,y,z,i): return x+y+z+i 7 模板: 8 {% load my_test %} 9 {% yy 12 34 56 78 %} #以空格做分割,傳參數 @register.simple_tag(name=‘yy‘) @register.simple_tag(is_safe=False) 默認是true,防止xss攻擊,顯示字符串。false瀏覽器直接解釋標簽 自定義的過濾器,可以放在if判斷裏, 自定義的標簽,不能放在if判斷裏條件裏 靜態文件寫活: css路徑修改的話html引用不必改變 index.html: {% load static %} <link rel="stylesheet" href="{% static ‘mycss.css‘ %}"> 寫死的 <link rel="stylesheet" href="/static/mycss.css"> 練習: 自定義一個標簽(輸入一個值,計算出階乘,顯示再頁面) 自定義一個過濾器 (輸入兩個參數,做累加,支持數字,字符串(如果一個數字,一個字符串,強行相加))
from django import template register=template.Library() @register.filter def myadd(value,arg): if type(value) == type(arg) == int or type(value) == type(arg) == str: return value+arg elif type(value) == int and type(arg) == str: return str(value) + arg elif type(value) == str and type(arg) == int: return value + str(arg) else: return ‘參數只能是數字或字符串‘ @register.simple_tag def myfactorial(n): if type(n) != int: # raise ValueError return ‘ValueError‘ if n == 0 or n == 1: return 1 else: return (n*myfactorial(n-1))自定義標簽
from django.shortcuts import render from django.utils.safestring import mark_safe # Create your views here. class Person: def __init__(self,name): self.name = name @classmethod def class_test(cls): print(‘class method‘) return ‘class method‘ def test(self): print(‘method‘) return self.name # def __str__(self): # return self.name def index(request): n1 = 1 n2 = 2 n3 = 5 s1=‘a‘ s2=‘b‘ ss=‘lqz is big‘ i=20 ll=[‘lqz‘,18,[1,2,[2,3]]] ll4=[[1,2,3],[2,3,4],[1,2,9]] dic={‘name‘:‘lqz‘,‘age‘:18,‘t‘:[1,2,[2,3]]} b=True lqz=Person(‘lqz‘) egon=Person(‘egon‘) xiaohou=Person(‘xiaohou‘) monkey=Person(‘monkey‘) ll2=[lqz,egon,xiaohou,monkey] dic2={‘lqz‘:lqz,‘egon‘:egon} # print(lqz.class_test()) # print(dic[‘name‘].upper) ll3=[] ss2=‘‘ ss3=‘<a href="https://www.baidu.com">點我</a>‘ # ss3=mark_safe(ss3) import datetime now=datetime.datetime.now() file=1024*1024*1024 return render(request,‘index.html‘,locals()) # return render(request,‘index.html‘,{‘ss‘:ss,}) 建議使用這種視圖函數
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> {% load static %} <link rel="stylesheet" href="{% static ‘mycss.css‘ %}"> {# <link rel="stylesheet" href="/staticaa/mycss.css">#} </head> <body> <div>靜態文件寫活</div> <hr> {% load my_tags %} {#{{ ‘12‘|add }}#} <p>{{ n1|myadd:n2 }}</p> <p>{{ s1|myadd:s2 }}</p> <p>{{ s1|myadd:n2 }}</p> <p>{{ ‘@#@‘|myadd:33 }}</p> {% myfactorial ‘a‘ %} 自定義的過濾器,可以放在if判斷裏, 自定義的標簽,不能放在if判斷裏條件裏 <hr> <h3>變量</h3> <p>字符串:{{ ss }}</p> <p>數字:{{ i }}</p> <p>列表:{{ ll }}</p> <h3>句點符,做深度查詢</h3> <p>列表第2個值:{{ ll.2.2.0}}</p> <p>布爾類型:{{ b}}</p> <p>字典:{{ dic }}</p> <p>字典取值:{{ dic.age }}</p> <p>字典取值:{{ dic.t.2.1 }}</p> <p>對象:{{ lqz }}</p> <p>對象取值:{{ lqz.name }}</p> <h2>對象方法,不要加括號</h2> <p>對象方法:{{ lqz.test }}</p> <p>類方法:{{ lqz.class_test }}</p> <h3>註釋:前端看不到,django給處理了</h3> {#<p>類方法:{{ Person}}</p>#} <p>列表對象{{ ll2 }}</p> <p>列表對象取值{{ ll2.1 }}</p> <p>列表對象取值,在取值{{ ll2.1.name }}</p> <p>對象字典{{ dic2 }}</p> <p>對象字典取值{{ dic2.egon.name }}</p> <p>空列表的情況就是一個空列表{{ ll3 }}</p> <p>空字符串的情況 直接替換成空{{ ss2 }}</p> <h3>xss 跨站腳本攻擊 django為了解決這種攻擊行為所以對標簽進行了處理 特殊符號替換 瀏覽器不能直接解釋標簽只能原樣輸出 ,如果想直接讓瀏覽器解釋這個標簽 需要用 mark_safe()函數 在views中 告訴django不要處理</h3> <p>a標簽 {{ ss3 }}</p> <h4>字典:{{ ss.upper }}</h4> <h4>字典:{{ dic.name.upper }}</h4> < {#<script>alert(‘dsb‘)</script>#} {# xss:比如提交評論 存到數據庫 響應到html 瀏覽器解釋 就會彈窗 這就是xss攻擊 所以一定要處理 #} <h2>過濾器</h2> 冒號後不能加空格 now是第一個參數,冒號後面是第二個參數 <p>date過濾器 {{ now|date:‘Y-m-d:H:i:s‘ }}</p> <p>date過濾器 {{ now|date }}</p> <hr> 如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如: <p>default過濾器 {{ ss2|default:‘字符串沒有值‘ }}</p> <p>default過濾器 {{ ll3|default:‘列表沒有值‘ }}</p> <hr> 返回值的長度。它對字符串和列表都起作用 <p>length過濾器 {{ ll2|length }}</p> <hr> 將值格式化為一個 “人類可讀的” 文件尺寸 單位是B(例如 ‘13 KB‘, ‘4.1 MB‘, ‘102 bytes‘, 等等)。例如: <p>filesizeformat過濾器 {{ file|filesizeformat }}</p> <p>filesizeformat過濾器 {{ 1024|filesizeformat }}</p> <hr> 切片操作 <p>slice過濾器 {{ ‘lqzisbig‘|slice:‘1:4‘ }}</p> <hr> 如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾 帶空格的字符串不算點的數量 不帶空格的字符串算點的數量 <p>truncatechars過濾器 {{ ‘lqzisbigdddddddeee‘|truncatechars:9 }}</p> <p>truncatewords過濾器: {{ ‘lqz is big and egon is small‘|truncatewords:3 }}</p> <hr> <p>safe過濾器: {{ ss3|safe }}</p> {#可以在視圖函數裏處理 ss3=mark_safe(ss3)#} <p>{{ ss3 }}</p> <hr> 倆參數只能傳字符串和數字 相加,具體詳見源碼 <p>add過濾器: {{ 12|add:"3" }}</p> <p>add過濾器: {{ ‘eee‘|add:"3rrr" }}</p> <hr> <h1>模板語法之標簽</h1> {% for foo in ll %} <p>{{ forloop }}</p> <p>{{ forloop.counter }}</p> <p>{{ forloop.counter0 }}</p> <p>{{ forloop.revcounter }}</p> <p>{{ forloop.revcounter0 }}</p> <p>{{ forloop.first }}</p> <p>{{ forloop.last }}</p> {% if forloop.first %} lqz is big {% elif forloop.last %} 倆人都小 {% else %} egon is small {% endif %} <p>{{ foo }}</p> {% endfor %} <hr> {% for foo in ll %} <p>{{ foo }}</p> {% empty %} 沒有值 {% endfor %} <hr> {% for foo in ll3 %} <p>{{ foo }}</p> {% empty %} 一定要放在for循環中 沒有值 {% endfor %} <hr> {% for foo in ll4 %} {% for i in foo %} <p>{{ forloop }}</p> <p>{{ forloop.parentloop }}</p> {% endfor %} {% endfor %} <hr> if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。 {% with ttttt=dic.name %} 相當於重新賦值 <p>{{ dic.name }}</p> <p>{{ ttttt }}</p> <p>{{ ttttt }}</p> <p>{{ ttttt }}</p> {% endwith %} <hr> <hr> </body> </html>模板層
模板層