学flask的第二天之路由 - 图1

来说一下路由

在上面的代码中我们通过访问localhost加上5000就可以看到“hello world”了,想一下到底是怎么实现的。只能看到hello_world函数有一个返回值,但是我们的浏览器是怎么找到这个函数的呢?是通过使用 route() 装饰器来把函数绑定到 URL,就像是这样:

  1. @app.route('/')
  2. def index():
  3. return 'Index Page'
  4. @app.route('/hello')
  5. def hello():
  6. return 'Hello, World'

route修饰器里面呢的参数就是需要你在浏览器中输入的,只有这样匹配到你才能够访问到你的视图函数。

关于URL的参数

你会好奇,那我们的url是不是可以传递参数呢?答案是肯定的,我们可以通过在URL中加上需要传递的参数就好。需要传递的参数使用”<>”包围起来,先来看一下官方文档的说法:

通过把 URL 的一部分标记为 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 converter:variable_name ,可以 选择性的加上一个转换器,为变量指定规则。

这样说着是不是不太直观,还是来看一下代码:

  1. @app.route('/user/<username>')
  2. def show_user_profile(username):
  3. # show the user profile for that user
  4. return 'User %s' % username
  5. @app.route('/post/<int:post_id>')
  6. def show_post(post_id):
  7. # show the post with the given id, the id is an integer
  8. return 'Post %d' % post_id
  9. @app.route('/path/<path:subpath>')
  10. def show_subpath(subpath):
  11. # show the subpath after /path/
  12. return 'Subpath %s' % subpath

 这就是传递参数的方法,好不好奇如果我们不加转换器那么这些参数的类型是什么?答案是:“string”
再把转换器放出来吧:

string (缺省值) 接受任何不包含斜杠的文本
int 接受正整数
float 接受正浮点数
path 和string类型但是可以接受“/”
UUID 接受UUID字符串
any 接受你给出的类型

这是不一样的东西
any 在官方文档中是没有的,他的意思并不是你可以传入任何的参数,而是说这个参数可以从你给出的参数中选择一种匹配,如果你传递的参数并不在你给出的列表(或者说是元组)中是会报错的。看一下例子:

  1. @app.route('/any/<any(c,d,e):an>/')
  2. def hello_world(an):
  3. return 'Hello World!'+ an

当你的在浏览器中访问“127.0.0.1:5000/any/e”,就可以看到你想要的结果。


 当然上面的代码中你有没有发现其他的东西?仔细观察哦,你会发现在传递参数的时候,你需要保持视图函数中传递参数和route修饰器中的参数名一致,如果不一致是会出错的哦。
 同时,在URL中传递参数的时候,你可以在你的视图函数中使用默认参数。如果需要传入的参数有一个默认值,那么传不传值都是可以的,但是如果没有默认参数,当你不传入参数就会出错。

唯一URL和重定向行为

回到文章最开始的代码,你会发现你是在浏览器中输入的是“127.0.0.1:5000”也没有输入“/”为什么这个也能够匹配呢?这就是flask的唯一URL和重定向行为,说起来不直观,那就还是放出代码来吧:

  1. @app.route('/projects/')
  2. def projects():
  3. return 'The project page'
  4. @app.route('/about')
  5. def about():
  6. return 'The about page'

projects 的 URL 是中规中举的,尾部有一个斜杠,看起来就如同一个文件夹。 访问一个没有斜杠结尾的 URL 时 Flask 会自动进行重定向,帮你在尾部加上一个斜杠。
about 的 URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问这个 URL 时添加了尾部斜杠就会得到一个 404 错误。这样可以保持 URL 唯一,并帮助 搜索引擎避免重复索引同一页面。

构建URL

在这里会介绍一个很重要的函数,那就是 url_for(),我们在前面都是得到URL,那么我们自己可以构建URL吗?答案是当然可以,答案就是使用我们前面提到的重要的函数。
来看一下这个函数的用法:我们使用函数名作为第一个参数,同时可以传递任意多个参数,参数和函数中需要传递的参数一一对应起来:

  1. from flask import Flask, url_for
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return 'index'
  6. @app.route('/login')
  7. def login():
  8. return 'login'
  9. @app.route('/user/<username>')
  10. def profile(username):
  11. return '{}\'s profile'.format(username)
  12. with app.test_request_context():
  13. print(url_for('index'))
  14. print(url_for('login'))
  15. print(url_for('login', next='/'))
  16. print(url_for('profile', username='John Doe'))
  17. /
  18. /login
  19. /login?next=/
  20. /user/John%20Doe

http请求

常见的http请求有:

  • get
  • post
  • delete
  • ……
    flask的请求默认是使用的get请求,所以如果你想要你的flask支持其他的请求方式,那么你就需要自己去配置一下,当然那也不是什么难事,就像是这样:
  1. @app.route('/any/<any(c,d,e):an>/', methods=["get", "post"])
  2. def hello_world(an):
  3. return 'Hello World!'+ an

这样你的视图函数就支持post请求方式了,是不是真的很简单。