1. 程式人生 > 其它 >Flask之URL與檢視02

Flask之URL與檢視02

技術標籤:Python全棧開發flaskpython

Flask之URL與檢視02

一,URL與函式的對映

一個URL要與執行函式進行對映,使用的是@app.route裝飾器。@app.route裝飾器中,可以指定URL的規則來進行更加詳細的對映,比如現在要對映一個文章詳情的URL,文章詳情的URL是/article/id/,id有可能為1、2、3…,那麼可以通過以下方式

from flask import Flask,request
app = Flask(
__name__) @app.route('/') def hello_python(): return 'hello python' @app.route('/list/<path:sid>') # 預設是字串形式,否則會報錯 def article(sid): return '這是第{}篇文章'.format(sid) # any:可以指定多種路徑 @ app.route('/<any(dict, tuple):url_path>/') def item(url_path): return url_path @app.route('/ie')
# # https://www.baidu.com/s?wd=python def baidu(): return request.args.get('name') if __name__ == '__main__': app.run(debug=True)

尖括號是固定寫法,語法為,variable預設的資料型別是字串。如果需要指定型別,則要寫成converter:variable,其中converter就是型別名稱,可以有以下幾種:

  1. string: 預設的資料型別,接受沒有任何斜槓/的字串。
  2. int: 整形
  3. float: 浮點型。
  4. path: 和string類似,但是可以傳遞斜槓/
  5. uuid: uuid型別的字串。
  6. any:可以指定多種路徑
# any:可以指定多種路徑
@ app.route('/<any(dict, tuple):url_path>/')
def item(url_path):
    return url_path

如果不想定製子路徑來傳遞引數,也可以通過傳統的?=的形式來傳遞引數,例如:/article?id=xxx,這種情況下,可以通過request.args.get(‘id’)來獲取id的值。如果是post方法,則可以通過request.form.get(‘id’)來進行獲取。

@app.route('/ie')  # # https://www.baidu.com/s?wd=python
def baidu():
    return request.args.get('name')

如下圖顯示:
在這裡插入圖片描述

二,構造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/<id>')
def article(id):
    return '%s article detail' % id

@app.route('/')
def index():
    print(url_for('article',id=1))
    return "首頁"


if __name__ == '__main__':
    app.run(debug=True)

它會自動構造出一個URL
在這裡插入圖片描述

三,URL末尾的斜槓

有些URL的末尾是有斜槓的,有些URL末尾是沒有斜槓的。這其實是兩個不同的URL。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def Hello():
    return 'world'

@app.route('/article/')
def articles():
    return '文章列表頁'

if __name__ == '__main__':
    app.run(debug=True)

上述例子中,當訪問一個結尾不帶斜線的URL:/article,會被重定向到帶斜線的URL:/article/上去。
在這裡插入圖片描述

但是當我們在定義article的url的時候,如果在末尾沒有加上斜槓,但是在訪問的時候又加上了斜槓,這時候就會丟擲一個404錯誤頁面了:

@app.route("/article")
def articles(request):
    return "文章列表頁面"

以上沒有在末尾加斜槓,因此在訪問/article/的時候,就會丟擲一個404錯誤。
在這裡插入圖片描述

四,指定HTTP方法

在@app.route()中可以傳入一個關鍵字引數methods來指定本方法支援的HTTP方法,預設情況下,只能使用GET請求。可檢視原始碼:
在這裡插入圖片描述

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'hello'

@app.route('/login/',methods=['GET','POST'])
def login():
    return 'login'

if __name__ == '__main__':
    app.run(debug=True)

以上裝飾器將讓login的URL既能支援GET又能支援POST

五,重定向

重定向分為永久性重定向和暫時性重定向,在頁面上體現的操作就是瀏覽器會從一個頁面自動跳轉到另外一個頁面。比如使用者訪問了一個需要許可權的頁面,但是該使用者當前並沒有登入,因此我們應該給他重定向到登入頁面。

  1. 永久性重定向:http的狀態碼是301,多用於舊網址被廢棄了要轉到一個新的網址確保使用者的訪問,最經典的就是京東網站,你輸入www.jingdong.com的時候,會被重定向到www.jd.com,因為jingdong.com這個網址已經被廢棄了,被改成jd.com,所以這種情況下應該用永久重定向。
  2. 暫時性重定向:http的狀態碼是302,表示頁面的暫時性跳轉。比如訪問一個需要許可權的網址,如果當前使用者沒有登入,應該重定向到登入頁面,這種情況下,應該用暫時性重定向。

在flask中,重定向是通過**flask.redirect(location,code=302)**這個函式來實現的,location表示需要重定向到的URL,應該配合之前講的url_for()函式來使用,code表示採用哪個重定向,預設是302也即暫時性重定向,可以修改成301來實現永久性重定向。

# 可檢視原始碼
def redirect(location, code=302, Response=None):
from flask import Flask,request,url_for,redirect
app = Flask(__name__)

@app.route('/login')
def login():
    return 'login'

@app.route('/profile/')
def profile():
    name = request.args.get('name')
    if name:
        return name
    else:
        return redirect(url_for('login'),code=301)

if __name__ == '__main__':
    app.run(debug=True)

六,關於響應(Response)

檢視函式中可以返回以下型別的值:

  1. Response物件。
  2. 字串。其實Flask是根據返回的字串型別,重新建立一個werkzeug.wrappers.Response物件,Response將該字串作為主體,狀態碼為200,MIME型別為text/html,然後返回該Response物件。
  3. 元組。元組中格式是(response,status,headers)。response為一個字串,status值是狀態碼,headers是一些響應頭。
  4. 如果不是以上三種類型。那麼Flask會通過Response.force_type(rv,request.environ)轉換為一個請求物件。
  5. 返回型別必須是字串,字典,元組,Response例項或可呼叫的WSGI
from flask import Flask,Response,make_response
app = Flask(__name__)

@app.route('/')
def about():
    # return 'chen'
    # return [1, 2, 3]  # TypeError:檢視函式未返回有效響應。返回型別必須是字串,字典,元組,Response例項或可呼叫的WSGI,但這是一個列表
    # return {"name": 'python'}
    # return ('name', 'python')  # 只返回name,
    # return 'python', 400    # 元組形式,返回python,
    
    # return Response('python', status=200, mimetype='text/html')  # 可自行檢視Response原始碼
    return make_response('你好')

@app.errorhandler(404)
def not_found():
    return 'not found',404

if __name__ == '__main__':
    app.run(debug=True)

可以使用make_response函式來建立Response物件,這個方法可以設定額外的資料,比如設定cookie,header資訊。

from flask import make_response

@app.route('/about/')
def about():
    return make_response('about page')