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

时间:2015-04-09 20:50:24

标签: python regex flask jinja2

我正在构建看起来像这样的网址,使用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个字符的字符串。但我宁愿传递参数,以免它首先被截断。有干净的方法吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

e.g。

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

当您在代码中使用url_for()时,将使用正确的位数构建网址。

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