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
