一、動態路由
在前面的博客中,我們學習了如何創建基本的 Flask 應用,并定義了一些簡單的路由。但有時候,我們需要更加靈活的路由,能夠根據用戶請求的不同來動態生成響應。Flask 提供了動態路由的功能,使我們能夠輕松處理這種需求。
使用動態路由參數
動態路由是指路由中的某些部分可以是變量,這樣在處理請求時可以獲取這些變量的值。例如:
from flask import Flaskapp = Flask(__name__)@app.route('/user/<username>')
def show_user_profile(username):return f'User {username}'@app.route('/post/<int:post_id>')
def show_post(post_id):return f'Post {post_id}'
在上面的例子中,<username>
和 <int:post_id>
都是動態路由參數。當用戶訪問 /user/john
時,username
參數將被設置為 'john'
;當用戶訪問 /post/1
時,post_id
參數將被設置為 1
。在Flask中,除了int
之外,還有一些其他的數據類型可以用于動態路由。以下是一些常見的數據類型和它們的描述:
數據類型 | 描述 |
---|---|
int | 接受整數 |
float | 接受浮點數 |
path | 類似字符串,但可以包含斜杠(/) |
string | 默認類型,接受沒有斜杠的字符串 |
uuid | 接受UUID字符串 |
二、獲取請求中的數據
1. 在 GET 請求中獲取參數
在 Flask 中,可以使用 request.args
對象來獲取 GET 請求中傳遞的參數。這些參數通常是通過查詢字符串(Query String)傳遞的。
from flask import Flask, requestapp = Flask(__name__)@app.route('/search')
def search():query = request.args.get('q')return f'Search query: {query}'
用戶可以通過訪問 /search?q=Flask
來傳遞搜索參數。
2. 在 POST 請求中獲取表單參數(Content-Type=multipart/form-data Content-Type=application/x-www-form-urlencoded)
from flask import Flask, requestapp = Flask(__name__)@app.route('/login', methods=['POST'])
def login():username = request.form.get('username')password = request.form.get('password')return f'Username: {username}, Password: {password}'
3. 在 POST 請求中獲取raw數據(Content-Type=application/json Content-Type=text/plain)
from flask import Flask, requestapp = Flask(__name__)@app.route('/raw', methods=['POST'])
def get_raw_data():data = request.datareturn f'Raw data received: {data.decode()}'
4. 在 POST 請求中獲取文件數據(Content-Type=multipart/form-data)
from flask import Flask, requestapp = Flask(__name__)@app.route('/upload', methods=['POST'])
def upload_file():if 'file' not in request.files:return 'No file part'file = request.files['file']if file.filename == '':return 'No selected file'return f'File {file.filename} uploaded successfully'
5. 獲取請求中的header和cookie
from flask import Flask, requestapp = Flask(__name__)@app.route('/get_data')
def get_data():cookie_data = request.cookies.get('my_cookie')header_data = request.headers.get('User-Agent')return f'Cookie data: {cookie_data}, User-Agent: {header_data}'
三、視圖函數返回值
視圖函數的返回值會自動轉換為一個響應對象。如果返回值是一個字符串,那 么會被轉換為一個包含作為響應體的字符串、一個 200 OK 出錯代碼 和一 個 text/html 類型的響應對象。如果返回值是一個字典或者列表, 那么會調用 jsonify() 來產生一個響應。以下是轉換的規則:
-
如果視圖返回的是一個響應對象,那么就直接返回它。
-
如果返回的是一個字符串,那么根據這個字符串和缺省參數生成一個用于 返回的響應對象。
-
如果返回的是一個迭代器或者生成器,那么返回字符串或者字節,作為流 響應對待。
-
如果返回的是一個字典或者列表,那么使用 jsonify() 創建一個響應對象。
-
如果返回的是一個元組,那么元組中的項目可以提供額外的信息。元組中 必須至少包含一個項目,且項目應當由 (response, status) 、 (response, headers) 或者 (response, status, headers) 組 成。 status 的值會重載狀態代碼, headers 是一個由額外頭部 值組成的列表或字典。
-
如果以上都不是,那么 Flask 會假定返回值是一個有效的 WSGI 應用并把 它轉換為一個響應對象。
-
如果想要在視圖內部掌控響應對象的結果,那么可以使用 make_response() 函數。
from flask import Flask, jsonifyapp = Flask(__name__)# 返回字符串
@app.route('/string')
def return_string():return 'Hello, Flask!'# 返回元組 (response, status, headers)
@app.route('/tuple')
def return_tuple():return 'Hello, Flask!', 200, {'Content-Type': 'text/plain'}# 返回 Response 對象
@app.route('/response')
def return_response():return jsonify({'message': 'Hello, Flask!'})
重定向
在 Flask 中,可以使用 redirect 函數來進行重定向。
from flask import Flask, redirect, url_forapp = Flask(__name__)@app.route('/redirect_example')
def redirect_example():# 重定向到 /new_location 路由return redirect('/new_location')@app.route('/new_location')
def new_location():return 'New location!'
總結
在本篇博客中,我們學習了如何使用 Flask 處理動態路由,以及在請求中獲取參數的方法。無論是通過動態路由參數,還是通過請求對象的不同屬性,Flask 提供了豐富的工具來處理各種請求和路由需求。