目录
Flask是一个用于构建Web应用程序的Python微型框架。它被设计为:简单、轻量级且易于扩展的框架,适用于从小型应用到复杂的Web应用开发。
Flask-快速启动
1)下载相关软件包
pip install flask
2)创建一个py文件,引入Flask
from flask import Flask
3)然后编写方法,添加注解进行测试
from flask import Flask
app = Flask(__name__)
# 请求路径是 http://localhost:8080/hello
@app.route('/hello')
def hello_word():
return 'hello world !'
if __name__ == '__main__':
# 启动地址是本机的8080端口,打开调试
app.run(host='localhost', port=8080, debug=True)
Flask-参数读取
接口需要接收前端的参数,Flash使用其request进行获取参数
一般来说前端传参的方式分为以下几种:
-
URL携带参数,形如:http://localhost/test?name=xxx
-
表单数据
-
JSON数据
-
路径参数,形如:http://localhost/参数/test
-
请求头参数
URL携带参数
这种方式是通过 ?
然后在后面拼接参数
使用request.args
来获取这些参数,适用于GET请求中的参数。
@app.route("/args")
def param_args():
name = request.args.get('name', 'default')
return name
表单数据
使用request.form
来获取这些参数,适用于POST请求中的表单数据。
@app.route("/form", methods=['POST'])
def param_form():
name = request.form.get('name', 'default')
return name
JSON参数
使用request.get_json()
来获取解析后的JSON数据,适用于POST请求中的JSON数据。
@app.route("/json", methods=['POST'])
def param_json():
name = request.get_json().get('name', 'default')
return name
路径参数
就是在路径中拼接参数,参考REST风格
在路由定义中使用尖括号来捕获这些参数。
# 这里的name是传递过来的参数
@app.route("/<name>/url", methods=['POST'])
def param_rest(name):
return name
请求头参数
可以使用request.headers
来访问这些请求头参数
@app.route("/head", methods=['POST'])
def param_head():
name = request.headers.get('name', 'default')
return name
Flask-文件上传
文件上传也跟获取参数差不多,都是通过flask的request进行获取的
ALLOWED_EXTENSIONS = {'pdf', 'png', 'jpg', 'jpeg', 'gif'}
# 进行文件名的校验
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route("/upload", methods=['POST'])
def upload_file():
try:
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename) # from werkzeug.utils 包下的方法
upload_path = Path('../flask_upload')
if upload_path.exists() is False:
upload_path.mkdir()
file.save(os.path.join(upload_path, filename))
return "upload success"
except Exception:
return "upload fail"
注意:
-
secure_filename()
方法是用于确保文件名的安全性,以防止一些恶意操作和潜在的安全漏洞 -
上传文件到上一个目录的flask_upload文件夹中,如果文件夹不存在,则创建
Blueprint
Blueprint是Flask框架中用于组织和管理应用程序的模块化方式,使用Blueprint可以让flask项目变成多模块化,提高代码的可维护性、可扩展性和组织性。
举个例子:
一个项目中有操作用户的接口,有操作订单的接口,有操作物流的接口;如果这些接口都写在同一个py文件中,会难以维护并且可读性低,所以需要使用Blueprint进行多模块化。用户、订单和物流的接口分别写在不同的文件中
使用步骤
1)创建多个不同的文件,分别编写接口
这里模拟了操作用户的接口,业务代码省略不写
from flask import Blueprint
user_blueprint = Blueprint('user', __name__)
@user_blueprint.route('/get')
def get_user():
return "this is a user"
这里同上,模拟了订单的接口,先忽略访问路径一致的问题,后面会解决
from flask import Blueprint
order_blueprint = Blueprint('order', __name__)
@order_blueprint.route('/get')
def get_order():
return "this is an order"
2)创建一个主启动类(主应用程序)
from flask import Flask
from my_flask.api.order_controller import order_blueprint
from my_flask.api.user_controller import user_blueprint # 上面写的user的接口
# 创建主程序
app = Flask(__name__)
# 将Blueprint注入进主程序
def register_blueprints():
# 将操作user的接口注入主程序,并且访问user接口的所有URL都是以/api/user开头
app.register_blueprint(user_blueprint, url_prefix='/api/user')
app.register_blueprint(order_blueprint, url_prefix='/api/order')
if __name__ == '__main__':
register_blueprints()
app.run(host='localhost', port=8080, debug=True)
然后启动主启动类,就能同时访问user和order了,实现了各个模块单独维护的目的