基本路线
可以使用 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
的默认值。匹配第一个路径时,没有值传递给视图功能。
另请注意,默认情况下,变量规则的类型是字符串。但是,你可以通过为变量添加前缀来指定几种不同的类型,例如 int
和 float
:
@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 错误。