3 回答

TA貢獻1847條經驗 獲得超7個贊
@app.route('/event/<event>')
<event>
,在本例中為字符串。有關此內容的詳細信息,請參閱 Flask 快速入門。您不能像在這里嘗試的那樣通過URL傳遞任意對象。
通常,您在此處會有某種類型的 ID,可用于查找對象,可能是在數據庫中。在這種情況下,您將該 ID 傳遞到該 ID 中,該 ID 將生成一個類似于 的 URL。url_for()
/events/123
然后,當您的路由被調用時,會在參數中為其指定 ID。然后,由您查找正確的對象并將其傳遞到模板中。event
event

TA貢獻1875條經驗 獲得超3個贊
當您收到時,, 只是一個字符串,而不是一個對象。因此,您應該在數據庫中找到事件 ID,例如<event>
@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貢獻1719條經驗 獲得超6個贊
使用自定義 URL 轉換器并提供一種序列化類的方法,這很快就會變得乏味:
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)
然后,按如下方式編寫轉換器:
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()
然后在使用以下命令創建應用程序時在 中聲明它:
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
請注意,這很好,我以前曾將其用于可以僅存儲在內存中的較小項目,但最好使用ID并將事件存儲在數據庫中。因此,假設您有一個應用程序工廠:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
db.init_app(app)
# etc.
您可以訪問數據庫并定義一個模型,如下所示:
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)
并傳遞 https://stackoverflow.com/a/61154232/5058116 中提到的。然后,您可以按如下方式查詢表/模型:<event_id>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 關注
- 151 瀏覽
添加回答
舉報