新创建项目
自己写个url映射到自定义的视图函数
在url中传递参数
app.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' #自定义访问返回结果 @app.route('/list/') def article_list(): return 'article list' #带参数传递 @app.route('/article/<id>/') def article(id): return '%s article' % id if __name__ == '__main__': app.run()
运行访问
其中<id>
,尖括号是固定写法,语法为<variable>
,variable
默认的数据类型是字符串。如果需要指定类型,
则要写成<converter:variable>
,其中converter
就是类型名称,可以有以下几种:
- string: 默认的数据类型,接受没有任何斜杠
/
的字符串。 - int: 整形
- float: 浮点型。
- path: 和
string
类似,但是可以传递斜杠/
。 - uuid:
uuid
类型的字符串。 -
any:可以指定多种路径,这个通过一个例子来进行说明:
@app.route('/<any(article,blog):url_path>/') def item(url_path): return url_path
以上例子中,
item
这个函数可以接受两个URL
,一个是/article/
,另一个是/blog/
。并且,一定要传url_path
参数,当然这个url_path
的名称可以随便。
如果不想定制子路径来传递参数,也可以通过传统的?=
的形式来传递参数,例如:/article?id=xxx
,这种情况下,可以通过request.args.get('id')
来获取id
的值。如果是post
方法,则可以通过request.form.get('id')
来进行获取。
构造URL(url_for):
一般我们通过一个URL
就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个URL
呢?url_for
函数就可以帮我们实现这个功能。url_for()
函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL
的后面作为查询参数。
通过构建URL
的方式而选择直接在代码中拼URL
的原因有两点:
- 将来如果修改了
URL
,但没有修改该URL
对应的函数名,就不用到处去替换URL
了。 -
url_for()
函数会转义一些特殊字符和unicode
字符串,这些事情url_for
会自动的帮我们搞定。
from flask import Flask,url_for app = Flask(__name__) @app.route('/') def hello_world(): #将my_list函数名以字符串方式传到url_for里面 print(url_for('my_list')) return 'Hello World!' @app.route('/list/') def my_list(): return 'my_list' if __name__ == '__main__': app.run()
运行,访问浏览器查看结果
在控制台打印出了如下结果:
在url_for添加参数,会自动添加到url后面
以后不管你原来的url如何修改,我都能通过url_for返回你修改过的正确url
# url_for笔记:
### `url_for`的基本使用:
`url_for`第一个参数,应该是视图函数的名字的字符串。后面的参数就是传递给`url`。
如果传递的参数之前在`url`中已经定义了,那么这个参数就会被当成`path`的形式给
`url`。如果这个参数之前没有在`url`中定义,那么将变成查询字符串的形式放到`url`中。
```python
@app.route('/post/list/<page>/')
def my_list(page):
return 'my list'
print(url_for('my_list',page=1,count=2))
# 构建出来的url:/my_list/1/?count=2
```
### 为什么需要`url_for`:
1. 将来如果修改了`URL`,但没有修改该URL对应的函数名,就不用到处去替换URL了。
2. `url_for`会自动的处理那些特殊的字符,不需要手动去处理。
```python
url = url_for('login',next='/')
# 会自动的将/编码,不需要手动去处理。
# url=/login/?next=%2F
```
### 强烈建议以后在使用url的时候,使用`url_for`来反转url。