27-url控制器之path方法
因爲基於re_path的路徑編寫方式是重複性高的編寫url,若是規則改變了,則對應的要去修改不少url,這樣是很不方便的
因此採用Django2.0的path去編寫url
第一個問題,函數 year_archive 中year參數是字符串類型的,所以須要先轉化爲整數類型的變量值,固然year=int(year) 不會有諸如如TypeError或者ValueError的異常。那麼有沒有一種方法,在url中,使得這一轉化步驟能夠由Django自動完成?
第二個問題,三個路由中article_id都是一樣的正則表達式,可是你須要寫三遍,當以後article_id規則改變後,須要同時修改三處代碼,那麼有沒有一種方法,只需修改一處便可?
在Django2.0中,可使用 path 解決以上的兩個問題
基本規則:
* 使用尖括號(<>)從url中捕獲值。
* 捕獲值中能夠包含一個轉化器類型(converter type),好比使用 <int:name> 捕獲一個整數變量。若果沒有轉化器,將匹配任何字符串,固然也包括了 / 字符。
* 無需添加前導斜槓。
Django默認支持如下5個轉化器:
* str,匹配除了路徑分隔符(/)以外的非空字符串,這是默認的形式
* int,匹配正整數,包含0。
* slug,匹配字母、數字以及橫槓、下劃線組成的字符串。
* uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
* path,匹配任何非空字符串,包含了路徑分隔符
28-path的自定義轉換器
對於一些複雜或者複用的須要,能夠定義本身的轉化器。轉化器是一個類或接口,它的要求有三點:
* regex 類屬性,字符串類型
* to_python(self, value) 方法,value是由類屬性 regex 所匹配到的字符串,返回具體的Python變量值,以供Django傳遞到對應的視圖函數中。
* to_url(self, value) 方法,和 to_python 相反,value是一個具體的Python變量值,返回其字符串,一般用於url反向引用。
29-url控制總結
1.path的簡單配置
2.有名分組,按照name的參數固定傳關鍵字參數
3.命名空間,namespace使用去給相同的變量定義名稱空間
4.反向解析就是不用硬編碼的形式,起別名的方式拿到最新的url形式
30-視圖層之請求對象
視圖,是一個簡單的Python 函數,它接受Web請求而且返回Web響應。響應能夠是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片. . . 是任何東西均可以。不管視圖自己包含什麼邏輯,都要返回響應。代碼寫在哪裏也無所謂,只要它在你的Python目錄下面。除此以外沒有更多的要求了——能夠說「沒有什麼神奇的地方」。爲了將代碼放在某處,約定是將視圖放置在項目或應用程序目錄中的名爲views.py的文件中
request大部分都是請求上的數據封裝好的字典
url包含的內容
1.協議 Https
2.IP地址
3.端口號
4.請求數據
/*
1.HttpRequest.GET
一個相似於字典的對象,包含 HTTP GET 的全部參數。詳情請參考 QueryDict 對象。
2.HttpRequest.POST
一個相似於字典的對象,若是請求中包含表單數據,則將這些數據封裝成 QueryDict 對象。
POST 請求能夠帶有空的 POST 字典 —— 若是經過 HTTP POST 方法發送一個表單,可是表單中沒有任何的數據,QueryDict 對象依然會被建立。
所以,不該該使用 if request.POST 來檢查使用的是不是POST 方法;應該使用 if request.method == "POST"
另外:若是使用 POST 上傳文件的話,文件信息將包含在 FILES 屬性中。
注意:鍵值對的值是多個的時候,好比checkbox類型的input標籤,select標籤,須要用:
request.POST.getlist("hobby")
3.HttpRequest.body
一個字符串,表明請求報文的主體。在處理非 HTTP 形式的報文時很是有用,例如:二進制圖片、XML,Json等。
可是,若是要處理表單數據的時候,推薦仍是使用 HttpRequest.POST 。
4.HttpRequest.path
一個字符串,表示請求的路徑組件(不含域名)。
例如:"/music/bands/the_beatles/"
5.HttpRequest.method
一個字符串,表示請求使用的HTTP 方法。必須使用大寫。
例如:"GET"、"POST"
6.HttpRequest.encoding
一個字符串,表示提交的數據的編碼方式(若是爲 None 則表示使用 DEFAULT_CHARSET 的設置,默認爲 'utf-8')。
這個屬性是可寫的,你能夠修改它來修改訪問表單數據使用的編碼。
接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數據)將使用新的 encoding 值。
若是你知道表單數據的編碼不是 DEFAULT_CHARSET ,則使用它。
7.HttpRequest.META
一個標準的Python 字典,包含全部的HTTP 首部。具體的頭部信息取決於客戶端和服務器,下面是一些示例:
CONTENT_LENGTH —— 請求的正文的長度(是一個字符串)。
CONTENT_TYPE —— 請求的正文的MIME 類型。
HTTP_ACCEPT —— 響應可接收的Content-Type。
HTTP_ACCEPT_ENCODING —— 響應可接收的編碼。
HTTP_ACCEPT_LANGUAGE —— 響應可接收的語言。
HTTP_HOST —— 客服端發送的HTTP Host 頭部。
HTTP_REFERER —— Referring 頁面。
HTTP_USER_AGENT —— 客戶端的user-agent 字符串。
QUERY_STRING —— 單個字符串形式的查詢字符串(未解析過的形式)。
REMOTE_ADDR —— 客戶端的IP 地址。
REMOTE_HOST —— 客戶端的主機名。
REMOTE_USER —— 服務器認證後的用戶。
REQUEST_METHOD —— 一個字符串,例如"GET" 或"POST"。
SERVER_NAME —— 服務器的主機名。
SERVER_PORT —— 服務器的端口(是一個字符串)。
從上面能夠看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 以外,請求中的任何 HTTP 首部轉換爲 META 的鍵時,
都會將全部字母大寫並將鏈接符替換爲下劃線最後加上 HTTP_ 前綴。
因此,一個叫作 X-Bender 的頭部將轉換成 META 中的 HTTP_X_BENDER 鍵。
8.HttpRequest.FILES
一個相似於字典的對象,包含全部的上傳文件信息。
FILES 中的每一個鍵爲<input type="file" name="" /> 中的name,值則爲對應的數據。
注意,FILES 只有在請求的方法爲POST 且提交的<form> 帶有enctype="multipart/form-data" 的狀況下才會
包含數據。不然,FILES 將爲一個空的相似於字典的對象。
9.HttpRequest.COOKIES
一個標準的Python 字典,包含全部的cookie。鍵和值都爲字符串。
10.HttpRequest.session
一個既可讀又可寫的相似於字典的對象,表示當前的會話。只有當Django 啓用會話的支持時纔可用。
完整的細節參見會話的文檔。
11.HttpRequest.user(用戶認證組件下使用)
一個 AUTH_USER_MODEL 類型的對象,表示當前登陸的用戶。
若是用戶當前沒有登陸,user 將設置爲 django.contrib.auth.models.AnonymousUser 的一個實例。你能夠經過 is_authenticated() 區分它們。
例如:
if request.user.is_authenticated():
# Do something for logged-in users.
else:
# Do something for anonymous users.
user 只有當Django 啓用 AuthenticationMiddleware 中間件時纔可用。
-------------------------------------------------------------------------------------
匿名用戶
class models.AnonymousUser
django.contrib.auth.models.AnonymousUser 類實現了django.contrib.auth.models.User 接口,但具備下面幾個不一樣點:
id 永遠爲None。
username 永遠爲空字符串。
get_username() 永遠返回空字符串。
is_staff 和 is_superuser 永遠爲False。
is_active 永遠爲 False。
groups 和 user_permissions 永遠爲空。
is_anonymous() 返回True 而不是False。
is_authenticated() 返回False 而不是True。
set_password()、check_password()、save() 和delete() 引起 NotImplementedError。
New in Django 1.8:
新增 AnonymousUser.get_username() 以更好地模擬 django.contrib.auth.models.User。
*/
request的經常使用方法
/*
1.HttpRequest.get_full_path()
返回 path,若是能夠將加上查詢字符串。
例如:"/music/bands/the_beatles/?print=true"
2.HttpRequest.is_ajax()
若是請求是經過XMLHttpRequest 發起的,則返回True,方法是檢查 HTTP_X_REQUESTED_WITH 相應的首部是不是字符串'XMLHttpRequest'。
大部分現代的 JavaScript 庫都會發送這個頭部。若是你編寫本身的 XMLHttpRequest 調用(在瀏覽器端),你必須手工設置這個值來讓 is_ajax() 能夠工做。
若是一個響應須要根據請求是不是經過AJAX 發起的,而且你正在使用某種形式的緩存例如Django 的 cache middleware,
你應該使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 裝飾你的視圖以讓響應可以正確地緩存。
*/
31-視圖響應對象
視圖函數本質上就是返回的HttpResponse,不論是render仍是別的函數,返回的都是HttpResponse
相應對象一共有3種類型
1.HttpResponse()
2.render()
3.redirect()
HttpResponse()括號內直接跟一個具體的字符串做爲響應體,比較直接很簡單,因此這裏主要介紹後面兩種形式
render()
render(request, template_name[, context])
結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 對象。
參數:
request: 用於生成響應的請求對象。
template_name:要使用的模板的完整名稱,可選的參數
context:添加到模板上下文的一個字典。默認是一個空字典。若是字典中的某個值是可調用的,視圖將在渲染模板以前調用它。
render方法就是將一個模板頁面中的模板語法進行渲染,最終渲染成一個html頁面做爲響應體。
redirect()
def my_view(request):
...
return redirect('/some/url/')
def my_view(request):
...
1)301和302的區別。
301和302狀態碼都表示重定向,就是說瀏覽器在拿到服務器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址能夠從響應的Location首部中獲取
(用戶看到的效果就是他輸入的地址A瞬間變成了另外一個地址B)——這是它們的共同點。
他們的不一樣在於。301表示舊地址A的資源已經被永久地移除了(這個資源不可訪問了),搜索引擎在抓取新內容的同時也將舊的網址交換爲重定向以後的網址;
302表示舊地址A的資源還在(仍然能夠訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓取新的內容而保存舊的網址。 SEO302好於301
2)重定向緣由:
(1)網站調整(如改變網頁目錄結構);
(2)網頁被移到一個新地址;
(3)網頁擴展名改變(如應用須要把.php改爲.Html或.shtml)。
這種狀況下,若是不作重定向,則用戶收藏夾或搜索引擎數據庫中舊地址只能讓訪問客戶獲得一個404頁面錯誤信息,訪問流量白白喪失;再者某些註冊了多個域名的
網站,也須要經過重定向讓訪問這些域名的用戶自動跳轉到主站點等。
從數據庫提取的值如何放進HTML的頁面裏?
有模板文件的時候,是render方法,找到文件之後,檢查模板語法,找到語法時,對語法內的變量進行替換,替換以後再返回給html的瀏覽器作解析
32-模板語法之變量
Django做爲模板語言的傳參的時候,會把模板語言內的如{{text}},中的text轉譯之後傳給瀏覽器(Django是爲了數據的安全性),瀏覽器拿到的只能是轉譯以後的字符串,因此解析不了標籤語言了,
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
"""
模板語法:
{{ }}-->>渲染變量
1.深度查詢 句點符
2.過濾器
{% %}-->>渲染標籤
:param request:
:return:
"""
name = 'pandaboy'
i = 10
l = [1, 2, 3, 'list']
info = {'name': 'yuan', 'age': 20}
return render(request, 'index.html', {'name': name, 'i': i, 'l': l, 'info': info})
# return render(request, 'index.html', loacls())
33-過濾器
過濾器的做用把視圖傳入的變量不直接顯示,加之內容或形式上的修飾後再進行傳參
語法
{{obj|filter__name:param}}
default
若是一個變量是false或者爲空,使用給定的默認值。不然,使用變量的值。例如
{{ value|default:"nothing" }}
length
返回值的長度。它對字符串和列表都起做用。例如:
若是 value 是 ['a', 'b', 'c', 'd'],那麼輸出是 4。
filesizeformat
將值格式化爲一個 「人類可讀的」 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
{{ value|filesizeformat }}
若是 value 是 123456789,輸出將會是 117.7 MB。
date
若是 value=datetime.datetime.now()
slice
若是 value="hello world"
truncatechars
若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(「...」)結尾。
參數:要截斷的字符數
例如:
{{ value|truncatechars:9 }}
safe
Django的模板中會對HTML標籤和JS等語法標籤進行自動轉義,緣由顯而易見,這樣是爲了安全。可是有的時候咱們可能不但願這些HTML元素被轉義,好比咱們作一個內容管理系統,後臺添加的文章中是通過修飾的,這些修飾多是經過一個相似於FCKeditor編輯加註了HTML修飾符的文本,若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在Django中關閉HTML的自動轉義有兩種方式,若是是一個單獨的變量咱們能夠經過過濾器「|safe」的方式告訴Django這段代碼是安全的沒必要轉義。好比:
value="<a href="">點擊</a>"
{{ value|safe}}
34-模板語法之標籤
for標籤
遍歷每一個元素
{% for person in person_list %}
<p>{{ person.name }}</p>
{% endfor %}
能夠利用{% for obj in list reversed %}反向完成循環。
遍歷一個字典:
{% for key,val in dic.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}
注:循環序號能夠經過{{forloop}}顯示
for...empty...
for 標籤帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,能夠有所操做。
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
if標籤
{% if %}會對一個變量求值,若是它的值是「True」(存在、不爲空、且不是boolean類型的false值),對應的內容塊會輸出。
{% if user != None%}
<p>登陸成功</p>
{% else %}
<p>請登陸</p>
{% endif %}
with別名標籤
使用一個簡單地名字緩存一個複雜的變量,當你須要使用一個「昂貴的」方法(好比訪問數據庫)不少次的時候是很是有用的
例如:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
csrf_token安全驗證標籤
csrf是由Django的服務端爲客戶端生成的一個"身份證",客戶端經過csrf_token的驗證以後就能完成各類請求服務端數據的操做