我正在构建看起来像这样的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个字符的字符串。但我宁愿传递参数,以免它首先被截断。有干净的方法吗?
您将值传递给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路由的原始问题,您现在可以指定具有固定位数的参数。
EG
@app.route('/numish/<int(fixed_digits=8):resourcenum>/')
当你在代码中使用url_for()时,url将使用正确的位数构造。
有关可用路由参数的更多详细信息,请访问:http://werkzeug.pocoo.org/docs/0.14/routing/