我一直在努力了解如何生成动态Flask网址。我已经阅读了文档和几个示例,但无法弄清楚为什么此代码不起作用:
path = 'foo'
@app.route('/<path:path>', methods=['POST'])
def index(path=None):
# do some stuff...
return flask.render_template('index.html', path=path)
我希望我的index.html模板能够提供给/foo
,但事实并非如此。我遇到了构建错误。我错过了什么?
如果我使用固定路径,例如/bar
,那么一切都可以正常运行。
@app.route('/bar', methods=['POST'])
答案 0 :(得分:7)
你已经掌握了它的长短。您需要做的就是使用/<var>
语法(或适当的/<converter:var>
语法)来装饰您的视图函数。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/<word>', defaults={'word': 'bird'})
def word_up(word):
return render_template('whatstheword.html', word=word)
@app.route('/files/<path:path>')
def serve_file(path):
return send_from_directory(app.config['UPLOAD_DIR'], path, as_attachment=True)
if __name__ == '__main__':
app.debug = True
app.run(port=9017)
当Flask从您尝试使用的动态路由的URL中提取变量时,默认情况下它将是Python中的unicode字符串。如果您使用<int:var>
或<float:var>
转化器创建变量,则会在应用空间中将其转换为适当的类型。
<path:blah>
转换器将匹配包含斜杠(/
)的字符串,因此您可以传递/blah/dee/blah
,并且视图函数中的路径变量将包含该字符串。如果不使用path
转换器,flask会尝试将您的请求发送到路由/blah/dee/blah
上注册的视图函数,因为普通<var>
由下一个/
描述uri。
因此,查看我的小应用程序,/files/<path:path>
路径将为其找到的任何文件提供与用户在请求中发送的路径相匹配的文件。我从文档here中提取了此示例。
另外,您可以通过关键字arg
向route()
装饰器指定变量网址的默认值。
如果需要,您甚至可以根据您在应用领域中指定视图功能和路线的方式访问Werkzeug构建的基础url_map
。有关更多内容需要咀嚼,请查看有关URL注册的api docs。
答案 1 :(得分:1)
您可以使用add_url_rule()
:
def index(path=None):
return render_template('index.html', path=path)
path = '/foo'
app.add_url_rule(path, 'index', index)
如果你最终做了很多,你也可能想看看blueprint objects。