Flask基本使用
1.Flask路由
1.1 定义路由
from flask import Flask app = Flask(__name__) # 1.路由对应的URL必须以/开头 # 2.通过app的url_map属性获取所有的路由规则 (URL资源段 支持的请求方式 视图函数标记) # 3.可以通过route方法的methods参数指定路由支持的请求方式 @app.route(‘/hello‘, methods=[‘post‘, ‘get‘]) def index(): return "index" if __name__ == ‘__main__‘: print(app.url_map) # 获取路由信息 # for rule in app.url_map.iter_rules(): # print(rule.rule, rule.methods, rule.endpoint) app.run(debug=True)
1.2 路由变量: 传递URL路径参数, 实现动态URL
from flask import Flask app = Flask(__name__) # 路由变量: 传递URL路径参数 # 格式: /user/<路由变量名> @app.route(‘/user/<userid>‘) def index(userid): # 必须定义同名形参接收路由变量的值 print(userid) return "index" if __name__ == ‘__main__‘: app.run(debug=True)
1.3 路由转换器: 对URL传递的参数进行格式校验, 类似Django设置URL时的正则表达式参数
from flask import Flask app = Flask(__name__) # 路由转换器: 对路由变量进行格式校验 条件不满足返回404 # 格式: /user/<路由转换器名:路由变量> @app.route(‘/user/<int:userid>‘) # int: 内置转换器, 要求1-n个整数 def index(userid): print(userid) return "index" if __name__ == ‘__main__‘: app.run(debug=True)
1.4 自定义转换器: 开发者还可以自定义转换器, 更加灵活的校验路由变量
# 自定义转换器: # 1.定义转换器类, 继承BaseConverter # 2.设置regex属性 (正则匹配规则) # 3.添加自定义转换器 from flask import Flask from werkzeug.routing import BaseConverter app = Flask(__name__) # 1.定义转换器类:继承自BaseConverter class MobileConverter(BaseConverter): # 2.设置regex属性(匹配规则) regex = ‘1[3-9]\d{9}$‘ # 不要设置开头的^ # 3.添加自定义转换器: 往app,url_map.cpnverters添加转换器 app.url_map.converters[‘mob‘] = MobileConverter @app.route(‘/user/<mob:mobile>‘) def index(mobile): print(mobile) return "index" if __name__ == ‘__main__‘: # 获取所有的转换器 {转换器名: 转换器类} # print(app.url_map.converters) app.run(debug=True)
2. Flask请求: flask的请求数据通过 request
对象来获取
from flask import Flask, request from werkzeug.datastructures import FileStorage app = Flask(__name__) @app.route(‘/‘, methods=[‘get‘, ‘post‘]) def index(): # 获取请求的基础数据 # print(request.url) # 请求的URL # print(request.method) # 本次请求的请求方式 # print(request.headers) # 获取请求头信息 类字典对象 # print(request.headers[‘Host‘]) # print(request.headers.get(‘Host‘)) # 建议使用get方法, 键不存在不报错 # 请求传递数据 1> URL路径 -> 路由变量 2> 查询字符串 get 3> 请求体 post 4> 请求头 -> request.headers # 获取查询字符串 -> request.args xx?name=zs&age=20 类字典对象 # print(request.args.get(‘name‘)) # print(request.args.get(‘age‘)) # 请求体: 键值对(表单) 文本(json/xml) 文件(图片/音频) # 获取post键值对 -> request.form 类字典对象 # print(request.form.get(‘username‘)) # 获取post文本数据 -> request.data / request.json # print(request.data) # 返回bytes类型 # print(request.json.get(‘age‘)) # request.json直接将json字符串转为字典 # 获取post文件 -> request.files 类字典对象 file = request.files.get("avatar") # type: FileStorage # print(type(file)) # 返回 FileStorage文件对象 # 将文件保存到本地 file.save(‘123.jpg‘) # 获取文件的二进制数据 # img_bytes = file.read() # print(img_bytes) return "index" if __name__ == ‘__main__‘: app.run(debug=True)
3. Flask响应
3.1 访问静态资源
设置步骤:
① 将静态资源放入到 项目的 static 文件夹中 ② 通过内置的静态资源的访问路由, URL路径格式为 /static/<filename> 如 static目录放入文件 123.jpg, 则访问URL为 http://127.0.0.1:5000/static/123.jpg
Flask对象的初始化参数 也可以 修改静态资源的存储和访问路径
from flask import Flask app = Flask(__name__, # 导入名称, flask会根据该参数查询静态文件的存储路径 # 官方建议直接使用__name__, 表示从当前目录中查询静态文件存储路径 static_folder="static1", # 设置静态文件的存储目录 static_url_path=‘/res/img‘, # 设置静态文件的URL访问路径 如 127.0.0.1:5000/res/img/123.jpg ) if __name__ == ‘__main__‘: app.run(debug=True)
3.2 设置响应数据:
Flask中设置响应数据主要有两种方式: 设置多个返回值 自定义响应对象
3.2.1 三个返回值: Flask中 视图函数的返回值可以设置三个, 分别对应 响应体, 响应状态码, 响应头
from flask import Flask, redirect, url_for app = Flask(__name__) @app.route(‘/demo1‘) def demo1(): # 返回值: 响应体, 响应状态码, 响应头 return ‘demo1‘, 400, {‘A‘: 40}
3.2.2 自定义响应对象: 视图函数返回的 str / bytes
类型数据会被包装为 Response
响应对象, 也可以 创建响应对象来 自定义响应头 等信息
# 自定义响应对象 @app.route(‘/demo2‘) def demo2(): # 视图函数的返回值可以为str/bytes类型, 并且flask内部会将其包装为Response响应对象 # return ‘hello flask‘ # 创建响应对象 设置响应头时,需要手动创建响应对象 response = make_response(‘hello flask‘) # type: Response ==>指定了response的类型从而使headers能被点出来 # 设置响应头 response.headers[‘B‘] = 10 return response if __name__ == ‘__main__‘: app.run(debug=True)
3.3 返回Json:
不推荐使用 json.dumps()
直接返回, 返回的数据要符合 HTTP 协议规范, JSON
需要指定 content-type:application/json
接口需要返回 JSON
数据,在 Flask 中可以直接使用 jsonify()
生成一个 JSON 的响应
from flask import Flask, make_response, Response, jsonify app = Flask(__name__) @app.route(‘/demo3‘) def demo3(): dict1 = {‘name‘: ‘zs‘, ‘age‘: 20} # 字典转json字符串 # return json.dumps(dict1) # 可以将字典转json字符串, 并且设置响应头的content-type为application/json # return jsonify(dict1) return jsonify(name=‘zs‘, age=20) # 也支持关键字实参的形式 if __name__ == ‘__main__‘: app.run(debug=True)
3.4 重定向: flask中通过 redirect()
实现重定向功能
from flask import Flask, redirect app = Flask(__name__) @app.route(‘/demo3‘) def demo3(): return jsonify(name=‘zs‘, age=20) @app.route(‘/demo4‘) def demo4(): # 重定向到指定网站 # return redirect(‘http://www.baidu.com‘) # 重定向到自己的路由 只需要URL资源段 return redirect(‘/demo3‘) if __name__ == ‘__main__‘: app.run(debug=True)
4 状态保持: Cookie 和 Session
4.1 Cookie
特点: 将数据保存在 客户端 (用户的电脑上), 可以减轻服务器压力 访问网站时, 浏览器会 自动 将该网站的cookie数据发送给服务器 使用场景: 保存一些 不太重要的数据
代码示例:
from flask import Flask, make_response, Response, request app = Flask(__name__) @app.route(‘/‘) def index(): # 后端设置cookie: 通过响应体的set_cookie字段 # 创建响应对象 response = make_response(‘index‘) # type: Response # 设置响应头的set_cookie字段 value必须是str/bytes类型 response.set_cookie(‘per_page‘, ‘10‘, max_age=86400) # 删除cookie 本质: 设置max-age=0 # response.delete_cookie(‘per_page‘) # 返回响应对象 return response @app.route(‘/demo1‘) def demo1(): # 获取cookie: 浏览器会自动通过请求头的cookie字段来传递cookie数据 # request.cookies 直接获取到字典形式的cookie数据 print(request.cookies.get(‘per_page‘)) return ‘demo1‘ if __name__ == ‘__main__‘: app.run(debug=True)
4.2 Session
特点: 将数据保存在 服务端 (服务器的数据库中), 安全性更高 使用场景: 保存一些 重要/敏感的数据
代码示例:
from datetime import timedelta from flask import Flask, session app = Flask(__name__) # 设置应用秘钥 会被用于session签名 app.secret_key = ‘test‘ # 设置session过期时间 默认31天 app.permanent_session_lifetime = timedelta(days=14) @app.route(‘/‘) def index(): # session是一个类字典对象, 对其取值/赋值 就可以实现session数据的读写 # 记录session数据 session[‘username‘] = ‘zs‘ # 设置session支持过期时间 session.permanent = True # 删除session数据 # session.pop(‘username‘) return "index" @app.route(‘/demo1‘) def demo1(): # 获取session数据 name = session.get(‘username‘) print(name) return ‘demo1‘
5. 异常处理: flask对 HTTP错误 进行了封装, 可以捕获http错误, 也可以主动抛出http错误
from flask import Flask, abort # flask对http错误进行了封装, 可以捕获http错误也可以主动抛出http错误 app = Flask(__name__) # 捕获http错误 @app.errorhandler(404) def error_404(error): # 一旦进行捕获, 要求必须定义形参接收具体错误信息 return "<h3>您访问的页面去浪迹天涯了</h3> %s" % error # 还可以捕获系统内置错误 @app.errorhandler(ZeroDivisionError) def error_zero(error): return ‘除数不能为0‘ @app.route(‘/‘) def index(): # a = 1 / 0 abort(500) # 主动抛出异常 (只能抛出http错误) return "index" if __name__ == ‘__main__‘: app.run(debug=True)