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

how to preserve leading zeros in Flask routing

我正在构建看起来像这样的 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。这是我用来生成的 Jinja 代码JavaScript:

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

我可以简单地将传入值重新格式化为一个带有前导零的 8 个字符的字符串。但我宁愿将参数传递下去,这样一开始它就不会被截断。有没有一种干净的方法来做到这一点?

您正在将您的值传递给 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 字符串是正确引用。

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

例如

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

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

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