无参数url
在app.py中
@app.route('/')
def hello_world():
return 'hello world'
可以发现比普通的函数定义多了个装饰器
@app.route(‘/’)
被app.route修饰的函数称为视图函数
在对应的路由被访问时,执行对应的视图函数,同时app.route会将函数返回值封装在一个http响应中
示例中逻辑意为当根目录被访问时,执行hello_world函数,执行完毕后app.route将返回值封装到http响应
根路由是指127.0.0.1:5000,如果在app.run修改了主机和端口号,就是访问修改后的地址
有参数url
有些情况下url并不能完全确定,例如
@app.route('/blog/5')
这个url表示请求第5个blog
如果有很多blog,显然不能写几十个route,这不符合能偷则偷的理念,也不易于维护
很明显这里的5应该是一个变量,视图函数获取到这个变量后在函数中进行相应处理
@app.route('/blog/<id>')
对应的视图函数为
def blog(id):
return f"这是第{id}个blog"
设定参数的类型
不仅可以设定参数,还可以设定参数的类型
@app.route('/blog/<int:id>')
设定参数可以省去从url转换参数类型的工作
也可以防止源码泄露
设定类型后如果传入的参数类型不匹配,网页就会报错
将视图函数修改一下
@app.route('/blog/<id>')
def blog(id):
id = id + 1
return f"这是第{id}个blog"
当传入一个z时,网页是这样的
部分错误源码直接被展示出来了,显然这对网站来说是不安全的
把参数类型加上以后
@app.route('/blog/<int:id>')
def blog(id):
id = id + 1
return f"这是第{id}个blog"
返回的网页是404
这就起到了保护作用
url可用的参数类型
参数类型 | 描述 |
---|---|
string | 普通字符串,不能含/ |
int | python的int,以及可以通过int()转换的字符 |
float | python的float,以及可以通过int()转换的字符 |
path | 路径,可以含/ |
uuid | 一组32位的十六进制数,url中的格式为88888888-4444-4444-4444-121212121212 |
any | 只接受备选值中的一个 |
int和float
int 和float很简单,url首先是个字符串,想从字符串中得到数字必然要经过格式转换
string和path
string和path的区别在于是只接受一层路径还是能接受多层路径
假设参数是string类型
@app.route('/blog/<string:id>')
那我就只能访问host:port/blog/id,当访问host:port/blog/id/a时就会404
而参数是path类型时
@app.route('/blog/<path:id>')
既能访问host:port/blog/id,也能访问host:port/blog/id/a或者host:port/blog/id/a/b/c
uuid
uuid有4种格式,但在url中只接受表格中的这种标准字符串格式:88888888-4444-4444-4444-121212121212
any
any是最特殊的一个类型,any类型的变量只接受预设的值中的一个
@app.route('/blog/<any(a,b,c):id>')
def blog(id):
return f"这是第{id}个blog"
在上面这个例子中只有id值为a,b或c时才能正常访问
查询字符串传递url
查询字符串就是在url结尾接上?参数名=参数值
比如www.baidu.com?name=a&pass=b
使用request.args.get获取查询字符串里的参数
@app.route('/test')
def test():
name=request.args.get('name')
return name
访问
127.0.0.1:5000/test?name=a
得到的是a
以这个形式传递参数,只要不少传参数就行
例如我可以访问
127.0.0.1:5000/test?name=a&a=b&c=d&e=f
这里传递了四个参数,但视图函数只需要name变量,只要name变量传进去了,其他参数无所谓
但是如果不传name,比如访问
127.0.0.1:5000/test?&a=b&c=d&e=f
页面就会报错
两种传参的差别
预定义传参
参数定死,不能多也不能少
简单易懂但不灵活
可以约束变量类型
查询字符串
只需要传必要的参数
参数名会暴露在url里
参数多了很乱