如何在Flask路由中保留前导零

问题描述 投票:1回答:2

我正在构建看起来像这样的URL,使用Flask进行路由:

http://hostname/nris/resource/00001234 http://hostname/nris/resource/99000025

最后一个段是一个8位整数,它将匹配我的数据库中的字符串。如果有的话,前导零是重要的。

我已经实现了一个基于Does Flask support regular expressions in its URL routing?的自定义正则表达式转换器。只要数字字段以非零开头,那就可以正常工作。这是我的路由代码(在/nris/中加载):

@app.route('/numish/<regex("[0-9]{8}"):resourcenum>/')
def numish(resourcenum):
    return "resourcenum: %s" % (resourcenum)
@app.route('/resource/<regex("[0-9]{8}"):resourcenum>/')
def resource_page(resourcenum):
    return render_template('singlemap.html', propnris=resourcenum)

当我访问http://hostname/nris/numish/00000004时,我明白了

resourcenum: 00000004

但是当我在我的模板中显示它时,控制台上显示的所有内容都是4,而在addSingleSiteLayer()中执行的数据库查询得到4,而不是00000004.这是我用来生成JavaScript的Jinja代码:

{% extends "maptemplate.html" %}
{% block mapcustom %}
console.log( "hello" );
console.log( {{propnris}} );
addSingleSiteLayer(map, {{propnris}} );
{% endblock %}

我可以简单地将传入的值重新格式化为带有前导零的8个字符的字符串。但我宁愿传递参数,以免它首先被截断。有干净的方法吗?

python regex flask jinja2
2个回答
3
投票

您将值传递给JavaScript,它忽略了您给它的整数字面上的前导零。这几乎不是Python或Flask的错。

通过将值包装在引号中使其成为字符串文字:

{% extends "maptemplate.html" %}
{% block mapcustom %}
console.log( "hello" );
console.log( "{{propnris}}" );
addSingleSiteLayer(map, "{{propnris}}" );
{% endblock %}

或者更好的是,format it as JSON会为您处理任何报价问题:

{% extends "maptemplate.html" %}
{% block mapcustom %}
console.log( "hello" );
console.log( {{propnris|tojson|safe}} );
addSingleSiteLayer(map, {{propnris|tojson|safe}} );
{% endblock %}

由于Flask的tojson过滤器生成有效的JavaScript兼容JSON输出,因此可以直接将其解释为JavaScript文字,并且可以正确引用Python字符串。


1
投票

顺便说一句,对于Flask中url路由的原始问题,您现在可以指定具有固定位数的参数。

EG

@app.route('/numish/<int(fixed_digits=8):resourcenum>/')

当你在代码中使用url_for()时,url将使用正确的位数构造。

有关可用路由参数的更多详细信息,请访问:http://werkzeug.pocoo.org/docs/0.14/routing/

© www.soinside.com 2019 - 2024. All rights reserved.