基本路线

可以使用 Flask 应用程序实例的 route 装饰器定义 Flask 中的路径:

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello Flask'

route 装饰器接受一个匹配的 URL 字符串。当应用程序收到对与此字符串匹配的 URL 的请求时,将调用已修饰的函数(也称为视图函数 )。所以对于一条约路线,我们会:

@app.route('/about')
def about():
    return 'About page'

重要的是要注意这些路由不是像 Django 那样的正则表达式。

你还可以定义变量规则以将 URL 段值提取到变量中:

@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id):
    # look up the blog post with id post_id
    # return some kind of HTML

这里变量规则位于 URL 的最后一段。无论 URL 的最后一段中的值是什么,都将作为 post_id 参数传递给视图函数(get_blog_post)。因此,对/blog/posts/42 的请求将检索(或尝试检索)id 为 42 的博客帖子。

重用 URL 也很常见。例如,我们可能希望/blog/posts 返回所有博客帖子的列表。所以我们可以有两个相同视图函数的路由:

@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
    # get the post or list of posts

请注意,我们还必须为 get_blog_post 中的 post_id 提供 None 的默认值。匹配第一个路径时,没有值传递给视图功能。

另请注意,默认情况下,变量规则的类型是字符串。但是,你可以通过为变量添加前缀来指定几种不同的类型,例如 intfloat

@app.route('/blog/post/<int:post_id>')

Flask 的内置 URL 转换器是:

string | Accepts any text without a slash (the default).
int    | Accepts integers.
float  | Like int but for floating point values.
path   | Like string but accepts slashes.
any    | Matches one of the items provided
uuid   | Accepts UUID strings

如果我们尝试访问 URL /blog/post/foo,并且最后一个 URL 段中的值无法转换为整数,则应用程序将返回 404 错误。这是正确的操作,因为没有/blog/post 规则和最后一个段中的字符串。

最后,路由也可以配置为接受 HTTP 方法。route 装饰器采用 methods 关键字参数,该参数是表示此路由的可接受 HTTP 方法的字符串列表。正如你可能假设的那样,默认值仅为 GET。如果我们有一个表单来添加新的博客帖子并想要返回 GET 请求的 HTML 并解析 POST 请求的表单数据,那么该路由将如下所示:

@app.route('/blog/new', methods=['GET', 'POST'])
def new_post():
    if request.method == 'GET':
        # return the form
    elif request.method == 'POST':
        # get the data from the form values

request 位于 flask 包中。请注意,在使用 methods 关键字参数时,我们必须明确要接受的 HTTP 方法。如果我们只列出了 POST,那么该路由将不再响应 GET 请求并返回 405 错误。