3.1 路由介绍
修改【Flask02】中hello.py文件的代码,修改后如下所示:
# coding: utf-8
from flask import Flask
app = Flask(__name__)
# 如果访问/,返回 ‘这是首页’
@app.route('/')
def hello_world():
return '这是首页'
# 如果访问/hello,返回 Hello,World!
@app.route('/hello')
def hello():
return 'Hello,World!'
然后在终端执行相应命令启动服务:
访问地址 http://127.0.0.1:5000,浏览器页面会显示 ’这是首页‘;如果访问地址 http://127.0.0.1:5000/hello,浏览器页面会显示 Hello, World!。这样就实现了通过访问不同的 URL 地址从而响应不同的页面。
3.2 变量规则
为了给URL增加变量的部分,我们需要把一些特定的字段标记成*<变量名字>。这些特定的字段会作为参数传入函数中。当然也可以通过指定一个可选的转换器通过规则<converter:变量名>*将变量转换为特定的数据类型。在hello.py中添加如下代码:
@app.route('/user/<username>')
def show_user_profile(username):
# 显示用户名
return 'User {}'.format(username)
当访问http://127.0.0.1:5000/user/啦啦啦时,页面显示为:User 啦啦啦
@app.route('/post/<int:post_id>')
def show_post(post_id):
# 显示提交整型的用户"id"的结果,注意"int"是将输入的字符串形式转换为整型数据
return 'Post {}'.format(post_id)
当访问http://127.0.0.1:5000/post/3时,页面显示为:Post 3。这里说的int转换是指用户在浏览器地址栏上输入的都是字符串,但是在传递给 show_post 函数处理时已经被转换为了整型。
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# 显示 /path/ 之后的路径名
return 'Subpath {}'.format(subpath)
当访问 http://127.0.0.1:5000/path/file/A/a.txt 时,页面显示为 Subpath file/A/a.txt。
转换器的主要类型如下:(意思是说只能接收这个类型的数据)
重定向行为
Flask的URL规则是基于Werkzeug的routing模块。该模块背后的思路是基于Apache和早期的HTTP服务器定下先例确保优雅和唯一的URL。在hello.py中添加如下代码:
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
这样会产生的结果是:当访问 http://127.0.0.1:5000/projects/ 时,页面会显示 The project page。当访问 http://127.0.0.1:5000/about 时,页面会显示 The about page;但是当访问 http://127.0.0.1:5000/about/ 时,页面就会报错 Not Found。
原因是:当用户访问页面忘记结尾斜线时,这个行为允许关联的URL继续工作,并且与Apache和其他的服务器的行为一致,反之则不行,因此在代码的URL设置时斜线只能多写不能少写;另外,URL保持唯一,有助于避免搜索引擎索引同一页面两次。
3.3 HTTP方法
先来看几个常用的HTTP方法:
GET:浏览器通知服务器只获取页面上的信息并且发送回来。这可能是最常用的方法
HEAD:浏览器告诉服务器获取信息,但是只对头信息感兴趣,不需要整个页面的内容。应用应该处理起来像接收到一个GET请求,但是不传递实际内容。
POST:浏览器通知服务器它要在URL上提交一些信息,服务器必须保证数据被存储且只存储一次,这是HTML表单通常发送数据到服务器的方法。(POST只会被触发一次)
PUT:同POST类似,但是服务器可能出发了多次存储过程,多次覆盖掉旧值。
DELETE:移除给定位置的信息。
OPTIONS:给客户端提供一个快速的途径来指出这个URL支持哪些HTTP方法。
HTTP有不同方法来访问URLs。默认情况下,路由只会相应GET请求,但是能通过给route()装饰器提供methods参数来改变。下面是一个例子:
@app.route('/login',methods['GET','POST'])
def login():
if request.method == 'POST':
do_the_login() # 如果是POST方法就执行登陆操作
else:
show_the_login_form() # 如果是GET方法就展示登陆表单
3.3 构建URL
可以使用*url_for()*方法去构建一个URL来匹配一个特定的函数。它接受函数名作为第一个参数,以及一些关键字参数,每一个关键字参数对应于URL规则的变量部分。未知变量部分被插入到URL中作为查询参数
总结:路由还是挺有意思的,虽然现在稍微有点懵。简单来说的话,route装饰器就是用于把一个函数绑定到一个URL上。这个URL里边可以包含变量,这个变量又可作为这个函数的参数传进来。
在实际操作中有时候会忘记把URL用单引号包起来,这个要注意。
另外对HTTP的几种方法也有了大致的了解,重点是GET和POST请求,一种是直接请求页面,另一种是可用于提交表单,PUT是在POST基础上可触发多次存储过程。