如何在Flask应用程序中设置静态url路径

如何在Flask应用程序中设置静态url路径,flask,Flask,我想这样做: app = Flask(__name__) app.config.from_object(mypackage.config) app.static_url_path = app.config['PREFIX']+"/static" app = Flask(__name__, static_url_path='PREFIX/static') 当我尝试时: print app.static_url_path 我得到了正确的static\u url\u路径 但是在我的模板中,当我使

我想这样做:

app = Flask(__name__)
app.config.from_object(mypackage.config)
app.static_url_path = app.config['PREFIX']+"/static"
app = Flask(__name__, static_url_path='PREFIX/static')
当我尝试时:

print app.static_url_path
我得到了正确的
static\u url\u路径

但是在我的模板中,当我使用('static')的
url\u时,使用jinja2生成的html文件仍然具有默认的静态url路径
/static
,其中缺少我添加的
前缀

如果我像这样硬编码路径:

app = Flask(__name__)
app.config.from_object(mypackage.config)
app.static_url_path = app.config['PREFIX']+"/static"
app = Flask(__name__, static_url_path='PREFIX/static')

它很好用。我做错了什么?

Flask在创建
Flask()
对象时创建URL路由。您需要重新添加该路线:

# remove old static map
url_map = app.url_map
try:
    for rule in url_map.iter_rules('static'):
        url_map._rules.remove(rule)
except ValueError;
    # no static view was created yet
    pass

# register new; the same view function is used
app.add_url_rule(
    app.static_url_path + '/<path:filename>',
    endpoint='static', view_func=app.send_static_file)

公认的答案是正确的,但有点不完整。诚然,为了更改
静态url\u路径
,还必须通过删除
静态
端点的现有
规则
,并使用修改后的url路径添加新的
规则
,来更新应用程序的
url\u映射
。但是,还必须更新
url\u映射
上的

对Werkzeug中的数据进行检查是有指导意义的。除了将新的
规则
添加到其
\u rules
属性之外,
映射
还通过将
规则添加到
\u rules\u的端点
来索引
规则。后一种映射是在调用
app.url\u map.iter\u规则('static')
时使用的。它也是Flask的
url\u for()
所使用的

下面是一个如何完全重写静态url路径的工作示例,即使它是在Flask应用程序构造函数中设置的。

app=Flask(\uuuuu name\uuuuuu,static\uurl\u path='/some/static/path')
a_new_static_path='/some/other/path'
#设置静态url路径属性。
app.static\u url\u path=新的\u静态\u路径
#从映射中删除旧规则。\u规则。
对于app.url\u map.iter\u规则(“静态”)中的规则:
app.url_map._rules.remove(rule)#可能只有一个。
#从映射中删除旧规则。_rules_by_endpoint。在这种情况下,我们可以
#重新开始。
app.url_map._rules_by_endpoint['static']=[]
#添加更新的规则。
app.add_url_rule(f'{a_new_static_path}/',
endpoint='static',
查看\u func=app.send\u静态\u文件)

谢谢,只需稍加修改即可工作。最初创建FLask对象时,我必须将static_url_path和static_folder都设置为None。然后添加url规则。[我无法按照您在解决方案中提到的那样删除规则,然后重新添加它]。。。非常感谢。@user3873617:好的,如果您将
static\u folder
设置为
None
,那么规则将不会首先创建。谢谢@MartijnPieters。有没有办法将这样一个前缀添加到为我的应用程序定义的所有路由中,而不仅仅是静态路由?@Patrick:你可以为所有路由使用一个蓝图,并使用前缀挂载该蓝图:
app。注册蓝图(你的蓝图,url\u prefix=“/prefix”)