Python web開發:Flask的URL和檢視
URL與檢視
URL與函式的對映:
從之前的helloworld.py檔案中,我們已經看到,一個URL要與執行函式進行對映,使用的是@app.route裝飾器。@app.route裝飾器中,可以指定URL的規則來進行更加詳細的對映,比如現在要對映一個文章詳情的URL,文章詳情的URL是/article/id/,id有可能為1、2、3…,那麼可以通過以下方式:
@app.route('/article/<id>/')
def article(id):
return '%s article detail' % id
其中,尖括號是固定寫法,語法為,variable預設的資料型別是字串。如果需要指定型別,則要寫成converter:variable
string: 預設的資料型別,接受沒有任何斜槓/的字串。
int: 整形
float: 浮點型。
path: 和string類似,但是可以傳遞斜槓/。
uuid: uuid型別的字串。
any:可以指定多種路徑,這個通過一個例子來進行說明:
@app.route('/<any(article,blog):url_path>/')
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/<id>/')
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