我写的烧瓶网站,我想有这样的路线:
@app.route('/')
@app.route('/<page_id>')
@app.route('/<page_id>/<subpage_id>')
def page(page_id=None, subpage_id=None):
...
虽然看起来这在理论上应该工作,它看起来像这实际上打破位于根静态/目录下的静态资源。 我想这样做的原因是,我的动态路由确实匹配“静态/ style.css文件”,从而覆盖静态文件的正常处理程序。
有没有办法解决? 是否有一个“静态”的处理程序,我可以将请求转发到,如果我检测PAGE_ID ==“静态”?
编辑:这是一个工作样本
@app.route('/<page_id>/<subpage_id>/<subsubpage_id>')
def xxx(page_id=None, subpage_id=None, subsubpage_id=None):
return 'hello'
如果你打开http://127.0.0.1:5000/static/css/style.css
现在你应该得到一个“你好”,而不是文件。
关于你的问题的根源:
是。 我在我的数据库页面对象,加载和基于该PAGE_ID / subpage_id / subsubpage_id当方法被调用显示。 有一个更好的方法吗? 我想加入不同的途径对每个当应用程序初始化页面,但我无法找到使这项工作与url_for结合的一个很好的方式。
您可以路由处理程序直接使用注册app.add_url_rule
。 它将使用该函数的名称为url_for
默认情况下,是的,但你可以通过一个覆盖该endpoint
的说法。
因此,也许你有这样的事情:
from functools import partial
def actual_handler(page):
return u'hello'
for page in session.query(Page):
route = u'/{0}/{1}/{2}'.format(page.id1, page.id2, page.id3)
app.add_url_rule(
route,
page.name, # this is the name used for url_for
partial(actual_handler, page=page),
)
获取会话可能会或可能不会是棘手的,并且可能涉及或不涉及工作就像手动调用session.remove()
; 我还没有使用的SQLAlchemy之前烧瓶处理外尝试。 假设你在第一时间使用SQLA。
也看到了在路线处理文档 。
至于采取优先于静态文件的航线原来的问题,我真的不知道; 根据我的烧瓶中,并WERKZEUG文档阅读,那是不应该的。 如果您仍然希望通过手动提供静态文件来解决这个问题,也许send_from_directory
会有所帮助。 想必你的Web服务器会提供静态文件,直接在生产,无论如何,所以它可能不值得上面的元编程黏糊糊的。
PS:一个事后; 金字塔的遍历 ,如果你的整个网站住在一个数据库可能是更好的选择。 它检查路径组件一次一个动态的,而不是具有静态路由的固定列表。
这是一个可怕的技巧,但你很可能只是做一些类似于:
@app.route('/<page_id>/<subpage_id>/<subsubpage_id>')
def xxx(page_id=None, subpage_id=None, subsubpage_id=None):
if page_id == 'static': # or whatever the path is to your assets
# make a response where you've filled the request yourself
return 'hello'