flask学习入门(二)

无参数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普通字符串,不能含/
intpython的int,以及可以通过int()转换的字符
floatpython的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里
参数多了很乱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值