如何在 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/
我正在构建看起来像这样的 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/