Python Flask Web框架(三)

来源:互联网 发布:javascript 技巧 编辑:程序博客网 时间:2024/06/05 18:12

一、路由

现代 Web 应用程序有优雅的URLs。这能够帮助人们记住URLs,这点在面向使用慢网络连接的移动设备的应用上非常有用。 如果用户不必通过点击首页而直接访问想要的页面,很可能他们会喜欢这个页面而且下次再次访问。

正如上面所说,route装饰器是用于把一个函数绑定到一个 URL 上。这有些基本的例子(上一节的课后习题可以参考以下代码):

@app.route('/')def index():    return 'Index Page'@app.route('/hello')def hello():    return 'Hello World'

但是不仅如此!你可以动态地构造 URL 的特定部分,也可以在一个函数上附加多个规则。

1. 变量规则

为了给 URL 增加变量的部分,你需要把一些特定的字段标记成<variable_name>。这些特定的字段将作为参数传入到你的函数中。当然也可以指定一个可选的转换器通过规则<converter:variable_name>将变量值转换为特定的数据类型。 这里有一些不错的例子:

@app.route('/user/<username>')def show_user_profile(username):    # 显示用户的名称    return 'User %s' % username@app.route('/post/<int:post_id>')def show_post(post_id):    # 显示提交整型的用户"id"的结果,注意"int"是将输入的字符串形式转换为整型数据    return 'Post %d' % post_id

示例代码以及显示部分结果:

此处输入图片的描述

存在如下转换器:

唯一 URLs / 重定向行为:

Flask 的 URL 规则是基于 Werkzeug 的 routing 模块。 该模块背后的想法是基于 Apache 和早期的 HTTP 服务器定下先例确保美丽和唯一的 URL。

以这两个规则为例:

@app.route('/projects/')def projects():    return 'The project page'@app.route('/about')def about():    return 'The about page'

虽然它们看起来确实相似,但它们结尾斜线的使用在 URL 定义 中不同。 第一种情况中,规范的 URL 指向 projects 尾端有一个斜线/。 这种感觉很像在文件系统中的文件夹。访问一个结尾不带斜线的 URL 会被 Flask 重定向到带斜线的规范URL去。

然而,第二种情况的 URL 结尾不带斜线,类似 UNIX-like 系统下的文件的路径名。此时如果访问结尾带斜线的 URL 会产生一个404 “Not Found”错误。

当用户访问页面时忘记结尾斜线时,这个行为允许关联的 URL 继续工作, 并且与 Apache 和其它的服务器的行为一致, 反之则不行,因此斜线只可少写不可多写;另外,URL 会保持唯一,有助于避免搜索引擎索引同一个页面两次。

2. 构建 URL

如果它可以匹配 URL ,那么 Flask 能够生成它们吗?当然 Flask 能够做到。你可以使用函数url_for()来针对一个特定的函数构建一个 URL 。它能够接受函数名作为第一参数,以及一些关键字参数, 每一个关键字参数对应于 URL 规则的变量部分。未知变量部分被插入到 URL 中作为查询参数。这里有些例子需要在 Python 的交互式环境下运行:

$ python>>> from flask import Flask, url_for>>> app = Flask(__name__)>>> @app.route('/')... def index(): pass...>>> @app.route('/login')... def login(): pass...>>> @app.route('/user/<username>')... def profile(username): pass...>>> with app.test_request_context():...     print url_for('index')...     print url_for('login')...     print url_for('login', next='/')...     print url_for('profile', username='John Doe')...//login/login?next=%2F/user/John%20Doe

(这里使用了test_request_context()方法,后面会给出解释。这个方法告诉 Flask 表现得像是在处理一个请求,即使我们正在通过 Python 的 shell 交互,大家可以仔细分析一下该函数的打印结果)。

为什么你要构建 URLs 而不是在模版中硬编码?这里有三个好的理由:

  1. 反向构建通常比硬编码更具备描述性。更重要的是,它允许你一次性修改 URL, 而不是到处找 URL 修改。
  2. 构建 URL 能够显式地处理特殊字符和Unicode转义,因此你不必去处理这些。
  3. 如果你的应用不在 URL 根目录下(比如,在 /myapplication 而不在 /),url_for()将会适当地替你处理好。

3. HTTP 方法

HTTP (也就是web 应用协议)有不同的方法来访问 URLs 。默认情况下,路由只会响应 GET 请求, 但是能够通过给 route() 装饰器提供 methods 参数来改变。这里是一个例子:

@app.route('/login', methods=['GET', 'POST'])def login():    if request.method == 'POST':        do_the_login()    else:        show_the_login_form()

如果使用GET方法,HEAD方法 将会自动添加进来。你不必处理它们。也能确保HEAD请求 会按照 HTTP RFC (文档在 HTTP 协议里面描述) 要求来处理, 因此你完全可以忽略这部分 HTTP 规范。 同样地,自从 Flask 0.6 后,OPTIONS 也能自动为你处理。

也许你并不清楚 HTTP 方法是什么?别担心,这里有一个 HTTP 方法的快速入门以及为什么它们重要:

HTTP方法(通常也称为“谓词”)告诉服务器客户端想要对请求的页面做什么。下面这些方法是比较常见的:

  • GET 浏览器通知服务器只获取页面上的信息并且发送回来。这可能是最常用的方法。
  • HEAD 浏览器告诉服务器获取信息,但是只对头信息感兴趣,不需要整个页面的内容。 应用应该处理起来像接收到一个 GET 请求但是不传递实际内容。在 Flask 中你完全不需要处理它, 底层的 Werkzeug 库会为你处理的。
  • POST 浏览器通知服务器它要在 URL 上提交一些信息,服务器必须保证数据被存储且只存储一次。 这是 HTML 表单通常发送数据到服务器的方法。
  • PUT 同 POST 类似,但是服务器可能触发了多次存储过程,多次覆盖掉旧值。现在你就会问这有什么用,有许多理由需要如此去做。考虑下在传输过程中连接丢失:在这种情况下浏览器和服务器之间的系统可能安全地第二次接收请求,而不破坏其它东西。该过程操作 POST 是不可能实现的,因为它只会被触发一次。
  • DELETE 移除给定位置的信息。
  • OPTIONS 给客户端提供一个快速的途径来指出这个 URL 支持哪些 HTTP 方法。从 Flask 0.6 开始,自动实现了该功能。

现在在 HTML4 和 XHTML1中,表单只能以 GET 和 POST 方法来提交到服务器。在 JavaScript 和以后的 HTML 标准中也能使用其它的方法。同时,HTTP 最近变得十分流行,浏览器不再是唯一使用 HTTP 的客户端。比如,许多版本控制系统使用 HTTP。

四、小结

本节讲了 flask 的路由,我们可以给 URL 添加规则,也可以动态地构建 URL 。

五、练习

请完成一个应用,当 URL 是http://127.0.0.1/sum/a/b时,其中ab都是数字,服务器返回它们的和。

0 0