(9)模板層 - templates(模板語言、語法、取值、過濾器、變量的使用)


django的模板語言:DTL

 

模板語言的變量傳入

這個是標簽 {{ 變量名 }}

{{ 變量名 }}   #模板語言的替換可以在模板中的任意位置生效

PS:通過 可以做深度查詢

 

模板語言的過濾器   #add就是一個過濾器

{ 變量名 | add:number}  #number就是數字,相當於把變量加數字,-number就是減法

PS:模板中不支持變量的運算,所以用過濾器可以做到運算的效果

 

 

python中的變量傳入模板中

模板語言的替換:把python中的變量替換到模板中的指定位置

urls.py   #app下的

from django.conf.urls import url,include  #include就是用來做路由分發的
from django.contrib import admin


from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'index/',views.index)
]

new_index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>模板語言</title>
</head>
<body>
{{ time }}
</body>
</html>

views.py   #app下的views

from django.shortcuts import render,HttpResponse,redirect,reverse
import time

def index(request):
ctime = time.time()
# 第三個參數是一個字典
return render(request,'new_index.html',{'time':ctime})

將多種python類型的數據傳入模板中

 

PS:原理就是python變量的名字是什么,在模板中直接用模板語言的格式{{ 變量名 }} 直接可以獲取

 

模板語言之變量的導入和處理

views.py   #app下的

from django.shortcuts import render,HttpResponse,redirect,reverse
import time,datetime

class Peroson():
def __init__(self,name):
self.name = name

def index(request):
ctime = time.time()

dic = {'name':'lqz','age':19}

li = [1,2,3,4,5]

def test():
return '我是個函數'

lqz = Peroson('lqz')

count = 10

b = True

counts = 1024

# dat是一個時間類型的對象
dat = datetime.datetime.now()

# 格式化時間賦值給變量
dates = dat.strftime('%Y-%m-%d')

# 在視圖內寫html的一些標簽樣式等,要在頁面中渲染出來得通過頁html中的內置過濾器 safe來實現
ss='<input type="text" name="name">'

# locals() 會把該函數中所有的變量,構造成字典傳到模板中
return render(request,'new_index.html',locals())

uels.py   #總路由

from django.conf.urls import url,include  #include就是用來做路由分發的
from django.contrib import admin


from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'index/',views.index)
]

new_index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>模板語言</title>
</head>
<body>
<input type="text" name="name">
<h1>模板語言之變量的導入和處理</h1>
<p>{{ ctime }}</p>
<p>{{ li }}</p>
<p>{{ dic }}</p>
{#取出字典中的值,是用 . \python中的是[]#}
<p>{{ dic.name }}</p>
<p>{{ dic.age }}</p>
{#列表取值#}
<p>{{ li.1 }}</p>
{#也可以傳入函數,但是不能加()#}
<p>{{ test }}</p>
{#傳入一個對象#}
<p>{{ lqz.name }}</p>
{#add就是內置過濾器#}
<p>{{ count | add:10 }}</p>
{#default內置過濾器 就是當傳入的變量是False的時候顯示后面設定的字符,如果是True的時候就是顯示True#}
<p>{{ b | default:'當b是False的時候顯示這個默認值' }}</p>
{#length 內置過濾器,計算變量的長度#}
<p>{{ dic | length }}</p>
{#filesizeformat 內置過濾器,將變量的值根據長度自動進行一個單位換算,不同長度顯示不同的單位,kb\mb\tb#}
<p>{{ counts | filesizeformat }}</p>
{#date內置過濾器,將python中的時間對象變成自己設定的類型在頁面中顯示,date后面格式一定是一個字符串形式#}
{#y對應年,m對應月,d對應日#}
<p>{{ dat | date:'Y年-m月-d日 H:i:s' }}</p>
{#在python中將時間處理成指定格式后返回,可以不用過濾器#}
<p>{{ dates }}</p>
{# safe 就是將視圖中的變量值原封不動的在頁面中顯示 #}
<p>{{ ss | safe }}</p>
</body>
</html>

 

xss攻擊

就是前端的一種攻擊方式,叫跨站腳本攻擊,比如提交數據的時候提交了一個heml可執行的代碼存入數據庫,在提交的時候是以字符串形式,然后訪問頁面的時候從數據庫內將這個字符串取出,由於是一串可執行代碼,前端用safe處理后直接執行了代碼,很有可能造成系統的奔潰或者嚴重的問題

xss攻擊簡單模擬

views.py

from django.shortcuts import render,HttpResponse,redirect,reverse
import time,datetime



def index(request):
# 變量的值是一個html可執行的語句
ss="<script>alert('xss攻擊')</script>"
return render(request,'new_index.html',locals())

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>模板語言</title>
</head>
<body>
<h1>xss攻擊模擬</h1>
{#如果這里用safe將變量的值原封不動的傳入,則會造成xss攻擊#}
<p>{{ ss | safe }}</p>
</body>
</html>

PS:django中已經幫我們處理了xss攻擊,只要不用safe,則永遠是以字符的形式顯示到頁面中,只有我們覺得這個是安全的才用safe

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM