在 Flask 框架中,我希望能夠確定選擇哪個請求路由來提供 URL,而不必實際請求 URL 本身。例如,如果我有一個像這樣的應用程式:
import flask
app = flask.Flask(__name__)
@app.route('/')
def index():
pass
@app.route('/<id:int>')
@app.route('/<id:int>-<slug>')
def show_page(id, slug = None):
pass
那么我希望能夠做類似的事情(虛構的例子):
route = app.get_url_rule("/12345")
并得到如下結果:
('show_page', {'id':12345,'slug':None})
據我所知,Flask 本身并沒有公開任何類似的功能,但是有沒有辦法深入到它的請求路由層(或者可能是 Werkzeug)來自己實作這個?
uj5u.com熱心網友回復:
您正在尋找的結果正是 Flask 通過 Werkzeug 為路由所做的。當你裝飾視圖函式時,規則被注冊在一個werkzeug.routing.Map. 當應用程式處理請求時,地圖會系結到請求以創建MapAdapter. 配接器有一個match()方法,它要么回傳endpoint, args匹配,要么引發路由錯誤,例如 307、404 或 405。Flask 呼叫它并使用結果呼叫適當的視圖函式。
呼叫app.create_url_adapter()以根據應用配置獲取配接器。當不在請求中時,這需要配置SERVER_NAME. 然后打電話adapter.match(url)找比賽。此示例忽略路由例外并回傳 None。
from werkzeug.exceptions import HTTPException
# remember to configure app.config["SERVER_NAME"]
def match_url(url):
adapter = app.get_url_adapter()
try:
return adapter.match(url)
except HTTPException:
return None
呼叫match_url("/12345-example")回傳('show_page', {'id': 12345, 'slug': 'example'})。
請注意,這通常沒有用,因為 Flask 的要點是它已經完成了路由并呼叫了適當的視圖。
uj5u.com熱心網友回復:
我用你的路由代碼嘗試了大衛主義的方法,以防這有幫助......
from flask import Flask, request
app = Flask(__name__)
@app.route('/<int:id>')
@app.route('/<int:id>-<slug>')
def show_page(id, slug = None):
adapter = app.create_url_adapter(request)
endpoint, values = adapter.match()
# Return this to frontend of ease of demo
return {endpoint: values}
/123退貨請求:
{
"show_page": {
"id": 123
}
}
/123-abc退貨請求:
{
"show_page": {
"id": 123,
"slug": "abc"
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/482458.html
