歡迎光臨
每天分享高質量文章

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//')
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的原因有兩點:

  1. 將來如果修改了URL,但沒有修改該URL對應的函式名,就不用到處去替換URL了。

  2. 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/上去。但是當我們在定義articleurl的時候,如果在末尾沒有加上斜杠,但是在訪問的時候又加上了斜杠,這時候就會丟擲一個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'

以上裝飾器將讓loginURL既能支持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

赞(0)

分享創造快樂