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 关注
- 90 浏览
添加回答
举报