蟒/瓶:路线与动态第一组分(python/Flask: Route with dynamic fir

2019-08-06 23:37发布

我写的烧瓶网站,我想有这样的路线:

@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现在你应该得到一个“你好”,而不是文件。

Answer 1:

关于你的问题的根源:

是。 我在我的数据库页面对象,加载和基于该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:一个事后; 金字塔的遍历 ,如果你的整个网站住在一个数据库可能是更好的选择。 它检查路径组件一次一个动态的,而不是具有静态路由的固定列表。



Answer 2:

这是一个可怕的技巧,但你很可能只是做一些类似于:

@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'


文章来源: python/Flask: Route with dynamic first component