Django MVT詳細說明(三)模板T

模板使用

一、模板介紹

1,作爲Web框架,Django提供了模板,可以很便利的動態生成HTML

2,模版系統致力於表達外觀,而不是程序邏輯

3,模板的設計實現了業務邏輯(view)與顯示內容(template)的分離,

二、模板引擎

在Django框架中,可以使用兩種模板引擎,一種是 默認的Django模板引擎 ,還有一種叫做其他 ,
比如Jinja2模板引擎 ;

1,模版引擎的作用和優點
模版引擎作用 是將View視圖中需要在前端HTML頁面中展示的數據,通過模板引擎的語法規則,展示出來;

模版引擎優點 是將業務邏輯的Python代碼和頁面設計的HTML代碼分離,使代碼更乾淨整潔更容易維護,使Python程序員和HTML/CSS程序員分開協作,提高生產的效率,且將HTML代碼分離出來,還能使其能夠複用;

2,配置引擎
pip install jinja2

TEMPLATES = [
{
‘BACKEND’: ‘django.template.backends.jinja2.Jinja2’,
‘DIRS’: [os.path.join(BASE_DIR,‘templates’)],
‘APP_DIRS’: True,
‘OPTIONS’: {
‘context_processors’: [
‘django.template.context_processors.debug’,
‘django.template.context_processors.request’,
‘django.contrib.auth.context_processors.auth’,
‘django.contrib.messages.context_processors.messages’,
],
},
},
{
‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’,
‘DIRS’: [os.path.join(BASE_DIR,‘templates’)],
‘APP_DIRS’: True,
‘OPTIONS’: {
‘context_processors’: [
‘django.template.context_processors.debug’,
‘django.template.context_processors.request’,
‘django.contrib.auth.context_processors.auth’,
‘django.contrib.messages.context_processors.messages’,
],
},
},
]

模板語法

一、註釋
註釋後的內容在網頁源文件中不可見
1,單行
{# msg #}

2,多行
{% comment %}
{% endcomment %}

ctrl+/ 產生的註釋仍然被django模板顯示

二、變量打印
{{變量名}}
假如沒有給模板引擎傳遞響應的變量,那麼該位置不顯示任何數據

三、條件判斷
{% if a == b %}
{% elif a > b %}
{% else %}
{% endif %}
變量邏輯判斷必須以空格隔開

四、循環

{% for item in items %}
{% empty %} 假如循環的迭代對象沒有元素,輸入empty中內容
{% endfor %}

五、過濾器
{ { 變量|過濾器 }}
針對變量使用特定過濾器處理
{ { name|lower|upper|default:‘zzy’|join:"++"|length }}

六、轉義
默認django中是把自動轉義打開,如果需要關閉自動轉義
1,塊轉義
{% autoescape off %}
{% endautoescape %}

2,變量轉義
{{ var|safe }}
在這裏插入圖片描述

七、跨站請求僞造保護(在下文中見詳細說明)
{% csrf_token %}

八、繼承標籤
{% extends ‘base.html’ %}

{% block content %}
子模板自定的內容
{% endblock %}
在這裏插入圖片描述

在這裏插入圖片描述
九、包含

{% include “footer.html” %}
把制定的模板內容添加到當前模板中

跨站請求僞造

csrf

全稱Cross Site Request Forgery,跨站請求僞造
某些惡意網站上包含鏈接、表單按鈕或者JavaScript,它們會利用登錄過的用戶在瀏覽器中的認證信息試圖在你的網站上完成某些操作,這
就是跨站攻擊
在這裏插入圖片描述
在django的模板中,提供了防止跨站攻擊的方法

在settings.py中啓用’django.middleware.csrf.CsrfViewMiddleware’中間件,此項在創建項目時,默認被啓用

1,{ % csrf_token % }模板標籤

2,如果某些視圖不需要保護,可以使用裝飾器csrf_exempt,模板中也不需要寫標籤,修改csrf2的視圖如下

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt

保護原理
加入標籤後,可以查看源代碼,發現多瞭如下代碼

django的csrf不是完全的安全

保持狀態

一、狀態保持
http協議是無狀態的:每次請求都是一次新的請求,不會記得之前通信的狀態
實現狀態保持的方式:在客戶端或服務器端存儲與會話有關的數據
狀態保持的目的是在一段時間內跟蹤請求者的狀態,可以實現跨頁面訪問當前請求者的數據

存儲方式包括cookie、session

使用cookie,所有數據存儲在客戶端,注意不要存儲敏感信息
使用sesison方式,所有數據存儲在服務器端,在客戶端cookie中存儲session_id
推薦使用session

二、使用Cookie
cookie是由服務器生成,存儲在瀏覽器端的一小段文本信息。

cookie的特點:
以鍵值對方式進行存儲。
通過瀏覽器訪問一個網站時,會將瀏覽器存儲的跟網站相關的所有cookie信息發送給該網站的服務器。
服務端獲取請求所攜帶的cookie 可以使用 request.COOKIES
cookie是基於域名安全的。www.baidu.com www.tudou.com之間的cookie互不影響
cookie是有過期時間的,如果不指定,默認關閉瀏覽器之後cookie就會過期。

在響應中設置
res = HttpResponse()
res.set_cookie(key=“username”, value=“zzy”, expires=timezone.now()+timedelta(days=7))

在響應中清除
res.delete_cookie(key=“username”)

從請求中獲取
name = request.COOKIES.get(“username”)

在這裏插入圖片描述

三、使用session
session存儲在服務器端。

session的特點:
session是以鍵值對進行存儲的。
session依賴於cookie。唯一的標識碼sessionid保存在 cookie中。
session也是有過期時間,如果不指定,默認兩週就會過期。

設置
request.session[“username”] = “zzy”
request.session.set_expiry(606024*7)

獲取
request.session.get(“username”)

清除
request.session.flush()

在這裏插入圖片描述

四、session的存儲

在settings.py文件中

項INSTALLED_APPS列表中添加:
‘django.contrib.sessions’,
項MIDDLEWARE_CLASSES列表中添加:
‘django.contrib.sessions.middleware.SessionMiddleware’,

可以使用settings.py的SESSION_ENGINE項指定

基於本地數據庫
SESSION_ENGINE=‘django.contrib.sessions.backends.db’

基於緩存
SESSION_ENGINE=‘django.contrib.sessions.backends.cache’

緩存和數據庫同時使用
SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db’

基於數據庫的太慢,基於緩存的容易丟失
那麼最好使用基於redis的內存數據庫最好

需要安裝模塊
pip install django-redis-sessions

修改settings中的配置,增加如下項
SESSION_ENGINE = ‘redis_sessions.session’
SESSION_REDIS_HOST = ‘localhost’
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ‘’
SESSION_REDIS_PREFIX = ‘session’

可以通過redis-cli查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章