URL與檢視
URL與函式的對映:
從之前的helloworld.py
檔案中,我們已經看到,一個URL
要與執行函式進行對映,使用的是@app.route
裝飾器。@app.route
裝飾器中,可以指定URL
的規則來進行更加詳細的對映,比如現在要對映一個文章詳情的URL
,文章詳情的URL
是/article/id/
,id有可能為1、2、3…,那麼可以透過以下方式:
@app.route('/article//' )
def article(id):
return '%s article detail' % id
其中
,尖括號是固定寫法,語法為
,variable
預設的資料型別是字串。如果需要指定型別,則要寫成
,其中converter
就是型別名稱,可以有以下幾種:
-
string: 預設的資料型別,接受沒有任何斜槓
/
的字串。 -
int: 整形
-
float: 浮點型。
-
path: 和
string
類似,但是可以傳遞斜槓/
。 -
uuid:
uuid
型別的字串。 -
any:可以指定多種路徑,這個透過一個例子來進行說明:
@app.route('//' )
def item(url_path):
return url_path
以上例子中,item
這個函式可以接受兩個URL
,一個是/article/
,另一個是/blog/
。並且,一定要傳url_path
引數,當然這個url_path
的名稱可以隨便。
如果不想定製子路徑來傳遞引數,也可以透過傳統的?=
的形式來傳遞引數,例如:/article?id=xxx
,這種情況下,可以透過request.args.get('id')
來獲取id
的值。如果是post
方法,則可以透過request.form.get('id')
來進行獲取。
構造URL(url_for):
一般我們透過一個URL
就可以執行到某一個函式。如果反過來,我們知道一個函式,怎麼去獲得這個URL
呢?url_for
函式就可以幫我們實現這個功能。url_for()
函式接收兩個及以上的引數,他接收函式名作為第一個引數,接收對應URL規則的命名引數,如果還出現其他的引數,則會新增到URL
的後面作為查詢引數。
透過構建URL
的方式而選擇直接在程式碼中拼URL
的原因有兩點:
-
將來如果修改了
URL
,但沒有修改該URL
對應的函式名,就不用到處去替換URL
了。 -
url_for()
函式會轉義一些特殊字元和unicode
字串,這些事情url_for
會自動的幫我們搞定。
下麵用一個例子來進行解釋:
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/article//')
def article(id):
return '%s article detail' % id
@app.route('/')
def index(request):
print(url_for("article",id=1))
return "首頁"
指定URL末尾的斜槓:
有些URL
的末尾是有斜槓的,有些URL
末尾是沒有斜槓的。這其實是兩個不同的URL
。
舉個例子:
@app.route('/article/')
def articles():
return '文章串列頁'
上述例子中,當訪問一個結尾不帶斜線的URL
:/article
,會被重定向到帶斜線的URL
:/article/
上去。但是當我們在定義article
的url
的時候,如果在末尾沒有加上斜槓,但是在訪問的時候又加上了斜槓,這時候就會丟擲一個404
錯誤頁面了:
@app.route("/article")
def articles(request):
return "文章串列頁面"
以上沒有在末尾加斜槓,因此在訪問/article/
的時候,就會丟擲一個404
錯誤。
指定HTTP方法:
在@app.route()
中可以傳入一個關鍵字引數methods
來指定本方法支援的HTTP
方法,預設情況下,只能使用GET
請求,看以下例子:
@app.route('/login/',methods=['GET','POST'])
def login():
return 'login'
以上裝飾器將讓login
的URL
既能支援GET
又能支援POST
。
頁面跳轉和重定向:
重定向分為永久性重定向和暫時性重定向,在頁面上體現的操作就是瀏覽器會從一個頁面自動跳轉到另外一個頁面。比如使用者訪問了一個需要許可權的頁面,但是該使用者當前並沒有登入,因此我們應該給他重定向到登入頁面。
-
永久性重定向:
http
的狀態碼是301
,多用於舊網址被廢棄了要轉到一個新的網址確保使用者的訪問,最經典的就是京東網站,你輸入www.jingdong.com
的時候,會被重定向到www.jd.com
,因為jingdong.com
這個網址已經被廢棄了,被改成jd.com
,所以這種情況下應該用永久重定向。 -
暫時性重定向:
http
的狀態碼是302
,表示頁面的暫時性跳轉。比如訪問一個需要許可權的網址,如果當前使用者沒有登入,應該重定向到登入頁面,這種情況下,應該用暫時性重定向。
在flask
中,重定向是透過flask.redirect(location,code=302)
這個函式來實現的,location
表示需要重定向到的URL
,應該配合之前講的url_for()
函式來使用,code
表示採用哪個重定向,預設是302
也即暫時性重定向
,可以修改成301
來實現永久性重定向。
以下來看一個例子,關於在flask
中怎麼使用重定向:
from flask import Flask,url_for,redirect
app = Flask(__name__)
app.debug = True
@app.route('/login/',methods=['GET','POST'])
def login():
return 'login page'
@app.route('/profile/',methods=['GET','POST'])
def profile():
name = request.args.get('name')
if not name:
# 如果沒有name,說明沒有登入,重定向到登入頁面
return redirect(url_for('login'))
else:
return name
作者:南窗客斯黃
源自:
https://blog.csdn.net/nunchakushuang/article/list/2