3 回答

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
@app.route('/event/<event>')
<event>
,在本例中,是一個(gè)字符串。
通常,您會(huì)在此處擁有某種 ID,可用于查找對象(可能在數(shù)據(jù)庫中)。在這種情況下,您可以將該 ID 傳遞到其中url_for()
,從而生成類似 的 URL?/events/123
。
然后,當(dāng)您的event
路由被調(diào)用時(shí),它會(huì)在參數(shù)中獲得 ID?event
。然后由您來查找正確的對象并將其傳遞到您的模板中。

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
當(dāng)您收到<event>, 只是一個(gè)字符串,而不是一個(gè)對象。所以你應(yīng)該在你的數(shù)據(jù)庫中找到事件ID,比如
@app.route('/event/<event>')
def event(event):
e=db.find_event(event) # event is the event number or id
if e:
return render_template('event.html', event=e)
else:
return f'Event {event} not found', 404

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
這可以使用自定義 URL 轉(zhuǎn)換器并提供序列化類的方法,這很快就會(huì)變得乏味:
from __future__ import annotations
import json
class Event():
? ? def __init__(self, name, date):
? ? ? ? self.name = name
? ? ? ? self.date = date
? ? def to_url(self):
? ? ? ? name = self.name.replace(' ', '+')
? ? ? ? # format the date similarly
? ? ? ? return f'name+{name}+date+{self.date}'
? ? @classmethod
? ? def from_url(cls, url: str):
? ? ? ? # extract name and date from url ...
? ? ? ? event = Event(name, date)
然后,您可以按如下方式編寫轉(zhuǎn)換器:
from werkzeug.routing import BaseConverter
from app.models.event import Event
class EventConverter(BaseConverter):
? ? def to_python(self, url):
? ? ? ? return Event.from_url(url)
? ? def to_url(self, event):
? ? ? ? return event.to_url()
然后在創(chuàng)建應(yīng)用程序時(shí)使用以下方法聲明它:
from app.converters.event_converter import EventConverter
# etc.
app.url_map.converters['event'] = EventConverter # add URL converters.
并將其用于您的路線,例如:
@app.route('/event/<event:event>')
def event(event):
? ? pass
請注意,這很好,我之前曾將它用于較小的項(xiàng)目,您可以將其僅存儲在內(nèi)存中,但您最好使用 ID 并將事件存儲在數(shù)據(jù)庫中。因此,假設(shè)您有一個(gè)應(yīng)用程序工廠:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
? ? app = Flask(__name__)
? ? db.init_app(app)
? ? # etc.
您將訪問數(shù)據(jù)庫并定義一個(gè)模型,如下所示:
from app import db
class Event(db.Model)
? ? id = db.Column(db.Integer, primary_key=True)
? ? name = db.Column(db.String, nullable=False)
? ? date = db.Column(db.DateTime, nullable=False)
后您可以按如下方式查詢表/模型:Event
from app.models.event import Event
@app.route('/event/<int:event_id>')
def event(event_id):
? ? event = Event.query.get(event_id)
? ? # etc.
- 3 回答
- 0 關(guān)注
- 198 瀏覽
添加回答
舉報(bào)