来说一下路由
在上面的代码中我们通过访问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 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 <converter:variable_name> ,可以 选择性的加上一个转换器,为变量指定规则。
这样说着是不是不太直观,还是来看一下代码:
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return '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 integer
return '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_for
app = 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请求方式了,是不是真的很简单。
网友评论