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