3

我一直在尝试了解如何生成动态 Flask URL。我已经阅读了文档和几个示例,但无法弄清楚为什么这段代码不起作用:

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'])

4

2 回答 2

8

你已经知道了它的长短。您需要做的就是使用/<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>or<float:var>转换器创建变量,它将在应用程序空间中为您转换为适当的类型。

<path:blah>转换器将匹配包含斜杠 ( ) 的字符串,/因此您可以传递/blah/dee/blah并且视图函数中的路径变量将包含该字符串。在不使用path转换器的情况下,flask 会尝试将您的请求发送到在 route 上注册的视图函数/blah/dee/blah,因为平原由uri 中<var>的下一个描述。/

所以看看我的小应用程序,该/files/<path:path>路由将提供它可以找到与用户在请求中发送的路径匹配的任何文件。我从这里的文档中提取了这个例子。

此外,您可以通过装饰器 的关键字arg为变量 URL 指定默认值。route()

如果您愿意,您甚至可以url_map根据您在应用程序空间中指定视图函数和路由的方式访问 Werkzeug 构建的底层。要了解更多内容,请查看有关 URL 注册 的api 文档。

于 2013-10-08T02:31:16.693 回答
3

您可以使用add_url_rule()

def index(path=None):
    return render_template('index.html', path=path)

path = '/foo'
app.add_url_rule(path, 'index', index)

如果您最终经常这样做,您可能还想查看蓝图对象。

于 2013-10-06T19:37:17.047 回答