Table of Contents
01路由规则
通过url_map可以查看所有路由信息
if __name__ == '__main__': print(app.url_map) |
输出结果:
Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) |
Method限定访问方式:
@app.route('/post_only', methods=['POST']) def post_only(): return "post_only page" |
输出结果:
Map([<Rule '/post_only' (POST, OPTIONS) -> post_only>, <Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) |
直接用浏览器打开这个url会405
同名路由:
@app.route('/test') def test1(): return "test1"
@app.route('/test') def test2(): return "test2" |
输出结果:
Map([<Rule '/test' (HEAD, OPTIONS, GET) -> test1>, <Rule '/test' (HEAD, OPTIONS, GET) -> test2>, <Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) |
直接在浏览器打开url,会看到test1,因为在路由表查到的第一个就是他
如果一个method用post一个method用get,则能直接区分
一函数多路由:
@app.route('/test1') @app.route('/test2') def test(): return "test" |
输出结果:
Map([<Rule '/test1' (HEAD, OPTIONS, GET) -> test>, <Rule '/test2' (HEAD, OPTIONS, GET) -> test>, <Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) |
两个url都可在浏览器访问
重定向:redirect
url_for反 解析
From flask import redirect,url_for |
@app.route('/test1') def test(): url=url_for("index") #url='/' #return redirect(url) |
02路由提取参数与自定义路由转换器
在django直接在路由中用正则表达式提取参数,flask中使用转换器<>
转换器默认有str,int,float,path,
@app.route('/goods/<int:goods_id>') def goods_detail(goods_id): return "goods %s detail page " % goods_id |
不加类型默认字符串(除了’/’)
@app.route('/goods/<goods_id>') def goods_detail(goods_id): return "goods %s detail page " % goods_id |
自定义规则:手机号规则
- 定义自己的转换器,以类定义
- 继承父类werkzeug.routing中的BaseCoverter
- 将自定义转换器类添加到app
- 使用刚刚在converters中存放的字典key
from werkzeug.routing import BaseConverter class RegexConverter(BaseConverter): … |
app.url_map.converters["re"]=RegexConverter |
@app.route('/send/<re:mobile>') def send_sms(mobile): return "send sms to %s " % mobile |
通用转换器:给re传参
class RegexConverter(BaseConverter): """docstring for RegexConverter""" def __init__(self, url_map, regex): super(RegexConverter, self).__init__(url_map)#调用父类初始化 self.regex=regex#正则表达式参数 |
使用方式与django相似
@app.route('/send/<re(r'1[34578]\d{9}'):mobile>') |
也可定义非通用的特殊转换器:init不传参数,regex直接在init内部定义
继承BaseConverter后也可对to_python和to_url覆写
to_python和to_url返回url正则匹配后被提取的参数值
to_url在使用url_for的时候被调用
Request
可用于提取前端传来的参数,最常用:data, form, args
Data从非表单请求体提取,form从表单转换为字典,args从url提取
拿一个:
name=request.form.get("name") |
拿重复值:
name_li=request.form.getlist("name") |
request.files获取用户上传的文件,拿取文件时使用的名字是表单名
@app.route('/upload', methods=["POST"]) def upload(): file_obj=request.files.get("pic") if file_obj is None: return "未上传文件" #保存文件 f=open("./demo.jpg","wb") f.write(file_obj.read()) f.close() return "上传成功" |
flask为文件对象封装了save方法
@app.route('/upload', methods=["POST"]) def upload(): file_obj=request.files.get("pic") if file_obj is None: return "未上传文件" #保存文件 file_obj.save("./demo.png") return "上传成功" |
With使用:只用open时每次打开文件后需要close,有可能写文件时出现异常,还要处理异常时关闭
With是一个上下文管理器:操作的是open后返回的f,会帮助关闭文件,相当于执行了self.close
#保存文件 with open("./demo.jpg","wb") as f: f.write(file_obj.read()) |