
来说一下路由
在上面的代码中我们通过访问localhost加上5000就可以看到“hello world”了,想一下到底是怎么实现的。只能看到hello_world函数有一个返回值,但是我们的浏览器是怎么找到这个函数的呢?是通过使用 route() 装饰器来把函数绑定到 URL,就像是这样:
@app.route('/')def index():return 'Index Page'@app.route('/hello')def hello():return 'Hello, World'
route修饰器里面呢的参数就是需要你在浏览器中输入的,只有这样匹配到你才能够访问到你的视图函数。
关于URL的参数
你会好奇,那我们的url是不是可以传递参数呢?答案是肯定的,我们可以通过在URL中加上需要传递的参数就好。需要传递的参数使用”<>”包围起来,先来看一下官方文档的说法:
通过把 URL 的一部分标记为
就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 converter:variable_name ,可以 选择性的加上一个转换器,为变量指定规则。
这样说着是不是不太直观,还是来看一下代码:
@app.route('/user/<username>')def show_user_profile(username):# show the user profile for that userreturn 'User %s' % username@app.route('/post/<int:post_id>')def show_post(post_id):# show the post with the given id, the id is an integerreturn 'Post %d' % post_id@app.route('/path/<path:subpath>')def show_subpath(subpath):# show the subpath after /path/return 'Subpath %s' % subpath
这就是传递参数的方法,好不好奇如果我们不加转换器那么这些参数的类型是什么?答案是:“string”
再把转换器放出来吧:
| string | (缺省值) 接受任何不包含斜杠的文本 |
|---|---|
| int | 接受正整数 |
| float | 接受正浮点数 |
| path | 和string类型但是可以接受“/” |
| UUID | 接受UUID字符串 |
| any | 接受你给出的类型 |
这是不一样的东西
any 在官方文档中是没有的,他的意思并不是你可以传入任何的参数,而是说这个参数可以从你给出的参数中选择一种匹配,如果你传递的参数并不在你给出的列表(或者说是元组)中是会报错的。看一下例子:
@app.route('/any/<any(c,d,e):an>/')def hello_world(an):return 'Hello World!'+ an
当你的在浏览器中访问“127.0.0.1:5000/any/e”,就可以看到你想要的结果。
当然上面的代码中你有没有发现其他的东西?仔细观察哦,你会发现在传递参数的时候,你需要保持视图函数中传递参数和route修饰器中的参数名一致,如果不一致是会出错的哦。
同时,在URL中传递参数的时候,你可以在你的视图函数中使用默认参数。如果需要传入的参数有一个默认值,那么传不传值都是可以的,但是如果没有默认参数,当你不传入参数就会出错。
唯一URL和重定向行为
回到文章最开始的代码,你会发现你是在浏览器中输入的是“127.0.0.1:5000”也没有输入“/”为什么这个也能够匹配呢?这就是flask的唯一URL和重定向行为,说起来不直观,那就还是放出代码来吧:
@app.route('/projects/')def projects():return 'The project page'@app.route('/about')def about():return 'The about page'
projects 的 URL 是中规中举的,尾部有一个斜杠,看起来就如同一个文件夹。 访问一个没有斜杠结尾的 URL 时 Flask 会自动进行重定向,帮你在尾部加上一个斜杠。
about 的 URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问这个 URL 时添加了尾部斜杠就会得到一个 404 错误。这样可以保持 URL 唯一,并帮助 搜索引擎避免重复索引同一页面。
构建URL
在这里会介绍一个很重要的函数,那就是 url_for(),我们在前面都是得到URL,那么我们自己可以构建URL吗?答案是当然可以,答案就是使用我们前面提到的重要的函数。
来看一下这个函数的用法:我们使用函数名作为第一个参数,同时可以传递任意多个参数,参数和函数中需要传递的参数一一对应起来:
from flask import Flask, url_forapp = Flask(__name__)@app.route('/')def index():return 'index'@app.route('/login')def login():return 'login'@app.route('/user/<username>')def profile(username):return '{}\'s profile'.format(username)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=//user/John%20Doe
http请求
常见的http请求有:
- get
- post
- delete
- ……
flask的请求默认是使用的get请求,所以如果你想要你的flask支持其他的请求方式,那么你就需要自己去配置一下,当然那也不是什么难事,就像是这样:
@app.route('/any/<any(c,d,e):an>/', methods=["get", "post"])def hello_world(an):return 'Hello World!'+ an
这样你的视图函数就支持post请求方式了,是不是真的很简单。
