当前位置:   article > 正文

Python----Flask(快速上手,前后端分离模式)_python flask

python flask

Flask官网地址

Flask 中文网

准备

1. Python 3.4 及更高版本的 Python 3 或Python 2.7 ,推荐使用最新版Python3。

2.安装Flask

pip install Flask 

3.选择一款api测试工具 

postman
Postman API Platformicon-default.png?t=N7T8https://www.postman.com/

apifox  Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。Apifox = Postman + Swagger + Mock + JMeter。集接口文档工具、接口Mock工具、接口自动化测试工具、接口调试工具于一体,提升 10 倍研发效率。是最好用的API文档工具,API自动化测试工具,API Mock工具,接口文档管理工具,接口文档生成工具。icon-default.png?t=N7T8https://apifox.com/?utm_source=baidu_pinzhuan&utm_medium=sem&utm_campaign=pinzhuan&utm_content=pinzhuan&utm_term=apifox

yapi

YApi-高效、易用、功能强大的可视化接口管理平台YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。icon-default.png?t=N7T8http://yapi.mglicai.com/

简单示例

一个最小的 Flask 应用示例

  1. from flask import Flask
  2. # 初始化app
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def hello_world():
  6. return 'Hello, World!'
  7. if __name__ == "__main__":
  8. # host指能够访问该后端服务的ip,一般填写0.0.0.0,表示任意ip都可访问
  9. # port指该后端服务部署的端口,不指定时默认为5000
  10. # debug指是否开启调试模式,当开启调试模式,修改后端文件会自行重启后端服务
  11. app.run(host="0.0.0.0", port=5600, debug=False)

执行以上代码后在控制台有以下输出:

在浏览器中访问以上两个中的任意地址。

或使用接口工具请求。

一个包含大部分请求方式的示例

  1. from flask import Flask
  2. from flask import request
  3. from flask import jsonify
  4. import os
  5. app = Flask(__name__)
  6. # 设置静态数据
  7. us_data = {
  8. "piter":{"sex":"man", "year":"24"}
  9. }
  10. # 一个接口由以下部分组成:路由、请求方法、接口函数。注意接口函数名不可重复。
  11. # 路由即url除ip和端口部分,使用 route() 装饰器来把函数绑定到 URL。
  12. # 请求方法即 HTTP 请求方式,这些请求方式是由 HTTP 协议定义的,用于描述客户端(如浏览器)如何与服务器进行交互。
  13. # Flask 支持所有标准的 HTTP 请求方式,并允许你通过装饰器和视图函数来灵活地处理它们。
  14. # GET请求,请求指定的页面信息,并返回实体主体。这是最常见的请求方式,通常用于获取数据或资源。
  15. @app.route('/get_data_by_us_name', methods=['GET'])
  16. def get_data_by_us_name():
  17. # 在flask中客户端发送的请求参数都可以使用request来获取。
  18. us_name = request.args.get("name")
  19. # 获取用户数据
  20. us_data_get = us_data.get(us_name, {})
  21. if us_data_get == {}:
  22. status_code = 400
  23. result = {
  24. "msg":"Query failed! Please check the query username.",
  25. "us_data":us_data_get,
  26. "code":status_code
  27. }
  28. else:
  29. status_code = 200
  30. result = {
  31. "msg":"Query successful.",
  32. "us_data":us_data_get,
  33. "code":status_code
  34. }
  35. # jsonify 是flask中一个用于生成 JSON 响应的便捷函数。
  36. return jsonify(result), status_code
  37. # POST请求,向指定资源提交数据进行处理请求,数据被包含在请求体中。
  38. # 提交json
  39. @app.route('/add_us_data_by_json', methods=['POST'])
  40. def add_us_data_by_json():
  41. global us_data
  42. add_us_data = request.get_json()
  43. if add_us_data["name"] in us_data:
  44. status_code = 400
  45. result = {
  46. "msg":"Add failed! Please check the query data.",
  47. "code":status_code
  48. }
  49. else:
  50. if add_us_data["name"] not in us_data:
  51. us_data[add_us_data["name"]] = {"sex":add_us_data["sex"], "year":add_us_data["year"]}
  52. status_code = 200
  53. result = {
  54. "msg":"Add successful.",
  55. "code":status_code
  56. }
  57. return jsonify(result), status_code
  58. # 例如提交表单
  59. @app.route('/add_us_data_by_form', methods=['POST'])
  60. def add_us_data_by_form():
  61. global us_data
  62. us_name = request.form.get("name",None)
  63. us_sex = request.form.get("sex",None)
  64. us_year = request.form.get("year",None)
  65. if us_name and us_sex and us_year:
  66. if us_name not in us_data:
  67. us_data[us_name] = {"sex":us_sex, "year":us_year}
  68. status_code = 200
  69. result = {
  70. "msg":"Add successful.",
  71. "code":status_code
  72. }
  73. else:
  74. status_code = 400
  75. result = {
  76. "msg":"Add failed! Please check the query data.",
  77. "code":status_code
  78. }
  79. # jsonify 是flask中一个用于生成 JSON 响应的便捷函数。
  80. return jsonify(result), status_code
  81. # 上传文件
  82. @app.route('/add_us_data_by_file', methods=['POST'])
  83. def add_us_data_by_file():
  84. us_pic_list = request.files.getlist("pic_list", None)
  85. us_pic = request.files.get("us_pic", None)
  86. pic_save_name_title = request.form.get("pic_save_name_title", None)
  87. if us_pic_list and us_pic and pic_save_name_title:
  88. if not os.path.isdir("./static"):
  89. os.mkdir("./static")
  90. for get_file in us_pic_list:
  91. get_file.save("./static/{}_{}".format(pic_save_name_title,get_file.filename))
  92. us_pic.save("./static/{}_{}".format(pic_save_name_title, us_pic.filename))
  93. status_code = 200
  94. result = {
  95. "msg":"Add successful.",
  96. "code":status_code
  97. }
  98. else:
  99. status_code = 400
  100. result = {
  101. "msg":"Add failed! Please check the query data.",
  102. "code":status_code
  103. }
  104. return jsonify(result), status_code
  105. # PUT请求,从客户端向服务器传送的数据取代指定的资源的内容。
  106. @app.route('/up_us_data/<name>', methods=['PUT'])
  107. def up_us_data(name):
  108. global us_data
  109. if name in us_data:
  110. us_year = request.form.get("year",None)
  111. if us_year:
  112. us_data[name]["year"] = us_year
  113. status_code = 200
  114. result = {
  115. "msg":"Updated successfully.",
  116. "code":status_code
  117. }
  118. else:
  119. result = {
  120. "msg":"Updated failed! Please check the query data.",
  121. "code":status_code
  122. }
  123. return jsonify(result), status_code
  124. # DELETE请求,请求服务器删除指定的资源或页面。
  125. @app.route('/delete_us_data/<name>', methods=['DELETE'])
  126. def delete_us_data(name):
  127. global us_data
  128. if name in us_data:
  129. us_data.pop(name)
  130. status_code = 200
  131. result = {
  132. "msg":"Delete successfully.",
  133. "code":status_code
  134. }
  135. else:
  136. result = {
  137. "msg":"Delete failed! Please check the query data.",
  138. "code":status_code
  139. }
  140. return jsonify(result), status_code
  141. # 此外在 Flask 中,你可以通过检查 request.method 来确定收到的请求类型,并在一个视图函数中处理多种请求方式。
  142. @app.route('/handle_request', methods=['GET', 'POST'])
  143. def handle_request():
  144. if request.method == 'GET':
  145. # 处理 GET 请求...
  146. return "Handling GET request."
  147. elif request.method == 'POST':
  148. # 处理 POST 请求...
  149. return "Handling POST request."
  150. if __name__ == "__main__":
  151. app.run(host="0.0.0.0", port=5600, debug=True)

运行代码后即可通过使用接口请求工具来测试接口。

一个连接数据库实现增删改查的应用示例

  1. from flask import Flask
  2. from flask import request
  3. from flask import jsonify
  4. from flask_sqlalchemy import SQLAlchemy
  5. # 数据配置
  6. mysql_host = "xxx.xxx.xxx.xxx"
  7. mysql_port = 3360
  8. mysql_user = "xxx"
  9. mysql_ps = "xxx"
  10. mysql_database = "xxx"
  11. app = Flask(__name__)
  12. app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://{}:{}@{}:{}/{}".format(mysql_user, mysql_ps, mysql_host, mysql_port,mysql_database)
  13. # 禁用对象修改的跟踪
  14. app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
  15. # 建立连接
  16. db = SQLAlchemy(app)
  17. # 定义用户表
  18. class User(db.Model):
  19. id = db.Column(db.Integer, primary_key=True)
  20. username = db.Column(db.String(80), unique=True, nullable=False)
  21. email = db.Column(db.String(120), unique=True, nullable=False)
  22. def __repr__(self):
  23. return f'<User {self.username}>'
  24. # 创建表
  25. with app.app_context():
  26. db.create_all()
  27. # 增
  28. @app.route('/add_us_data_by_json', methods=['POST'])
  29. def add_us_data_by_json():
  30. add_us_data = request.get_json()
  31. try:
  32. new_user = User(username=add_us_data['username'], email=add_us_data['email'])
  33. db.session.add(new_user)
  34. db.session.commit() # 提交事务以保存到数据库
  35. status_code = 200
  36. result = {
  37. "msg":"Add successful.",
  38. "code":status_code
  39. }
  40. except:
  41. db.session.rollback()
  42. status_code = 400
  43. result = {
  44. "msg":"Add failed! Please check the query data.",
  45. "code":status_code
  46. }
  47. return jsonify(result), status_code
  48. # 删
  49. @app.route('/delete_us_data/<id>', methods=['DELETE'])
  50. def delete_us_data(id):
  51. user = User.query.get(int(id)) # 通过 id 查询
  52. if user:
  53. db.session.delete(user)
  54. db.session.commit() # 提交事务以删除记录
  55. status_code = 200
  56. result = {
  57. "msg":"Delete successfully.",
  58. "code":status_code
  59. }
  60. else:
  61. db.session.rollback()
  62. status_code = 400
  63. result = {
  64. "msg":"Delete failed! Please check the query data.",
  65. "code":status_code
  66. }
  67. return jsonify(result), status_code
  68. # 改
  69. @app.route('/up_us_data/<id>', methods=['PUT'])
  70. def up_us_data(id):
  71. add_us_data = request.get_json()
  72. user = User.query.get(int(id))
  73. if user:
  74. user.email = add_us_data['email']
  75. user.username = add_us_data['username']
  76. db.session.commit() # 提交事务以保存更新
  77. status_code = 200
  78. result = {
  79. "msg":"Updated successfully.",
  80. "code":status_code
  81. }
  82. else:
  83. db.session.rollback()
  84. result = {
  85. "msg":"Updated failed! Please check the query data.",
  86. "code":status_code
  87. }
  88. return jsonify(result), status_code
  89. # 查
  90. @app.route('/get_data_by_us_name', methods=['GET'])
  91. def get_data_by_us_name():
  92. us_id = request.args.get("id",type=int)
  93. us_data = User.query.get(us_id)
  94. if not us_data:
  95. status_code = 400
  96. result = {
  97. "msg":"Query failed! Please check the query username.",
  98. "us_data":{},
  99. "code":status_code
  100. }
  101. else:
  102. us_data_get = {
  103. "id":us_data.id,
  104. "username":us_data.username,
  105. "email":us_data.email
  106. }
  107. status_code = 200
  108. result = {
  109. "msg":"Query successful.",
  110. "us_data":us_data_get,
  111. "code":status_code
  112. }
  113. return jsonify(result), status_code
  114. if __name__ == "__main__":
  115. app.run(host="0.0.0.0", port=5600, debug=True)

注意代码中数据库配置需要修改为实际的数据库配置,运行代码后即可通过使用接口请求工具来测试接口。

一个完整的flask后端项目结构

如上图所示,model文件通常用于定义数据表;static为静态文件夹用于存放一些用户上传的文件等;web用于存放蓝图,一般一个功能模块一个蓝图;app文件为程序入口,用于启动整个后端;congfig文件用于存放配置信息,如数据库配置等;requirements为该项目的依赖。

将上个例子拆解为这种结构后,对应代码如下:

app.py

  1. from flask_cors import CORS
  2. from web import create_app
  3. app = create_app()
  4. # 允许跨域请求
  5. CORS(app, supports_credentials=True)
  6. if __name__ == '__main__':
  7. app.run(debug=False, host="0.0.0.0", port=5600)

config.py

  1. mysql_host = "xxx.xxx.xxx.xxx"
  2. mysql_port = 3360
  3. mysql_user = "xxx"
  4. mysql_ps = "xxx"
  5. mysql_database = "xxx"
  6. class Config():
  7. """工程配置信息"""
  8. # 数据库的配置信息
  9. SQLALCHEMY_DATABASE_URI = "mysql+pymysql://{}:{}@{}:{}/{}".format(mysql_user, mysql_ps, mysql_host, mysql_port,mysql_database)
  10. SQLALCHEMY_TRACK_MODIFICATIONS = False
'
运行

models.py

  1. from flask_sqlalchemy import SQLAlchemy
  2. db = SQLAlchemy()
  3. class User(db.Model):
  4. id = db.Column(db.Integer, primary_key=True)
  5. username = db.Column(db.String(80), unique=True, nullable=False)
  6. email = db.Column(db.String(120), unique=True, nullable=False)
  7. def __repr__(self):
  8. return f'<User {self.username}>'

web----__init__.py

  1. from flask import Flask
  2. from model.models import db
  3. from config import Config
  4. def create_app():
  5. app = Flask(__name__)
  6. app.config.from_object(Config)
  7. app.config['JSON_AS_ASCII'] = False
  8. # 查询时会显示原始SQL语句
  9. app.config['SQLALCHEMY_ECHO'] = False
  10. # 注册蓝图
  11. from web.user import user
  12. app.register_blueprint(user)
  13. db.init_app(app)
  14. with app.app_context():
  15. db.create_all()
  16. return app

web---user---views.py

  1. from . import user
  2. from flask import request, jsonify
  3. from model.models import db, User
  4. # 增
  5. @user.route('/add_us_data_by_json', methods=['POST'])
  6. def add_us_data_by_json():
  7. add_us_data = request.get_json()
  8. try:
  9. new_user = User(username=add_us_data['username'], email=add_us_data['email'])
  10. db.session.add(new_user)
  11. db.session.commit() # 提交事务以保存到数据库
  12. status_code = 200
  13. result = {
  14. "msg":"Add successful.",
  15. "code":status_code
  16. }
  17. except:
  18. db.session.rollback()
  19. status_code = 400
  20. result = {
  21. "msg":"Add failed! Please check the query data.",
  22. "code":status_code
  23. }
  24. return jsonify(result), status_code
  25. # 删
  26. @user.route('/delete_us_data/<id>', methods=['DELETE'])
  27. def delete_us_data(id):
  28. user = User.query.get(int(id)) # 通过 id 查询
  29. if user:
  30. db.session.delete(user)
  31. db.session.commit() # 提交事务以删除记录
  32. status_code = 200
  33. result = {
  34. "msg":"Delete successfully.",
  35. "code":status_code
  36. }
  37. else:
  38. db.session.rollback()
  39. status_code = 400
  40. result = {
  41. "msg":"Delete failed! Please check the query data.",
  42. "code":status_code
  43. }
  44. return jsonify(result), status_code
  45. # 改
  46. @user.route('/up_us_data/<id>', methods=['PUT'])
  47. def up_us_data(id):
  48. add_us_data = request.get_json()
  49. user = User.query.get(int(id))
  50. if user:
  51. user.email = add_us_data['email']
  52. user.username = add_us_data['username']
  53. db.session.commit() # 提交事务以保存更新
  54. status_code = 200
  55. result = {
  56. "msg":"Updated successfully.",
  57. "code":status_code
  58. }
  59. else:
  60. db.session.rollback()
  61. result = {
  62. "msg":"Updated failed! Please check the query data.",
  63. "code":status_code
  64. }
  65. return jsonify(result), status_code
  66. # 查
  67. @user.route('/get_data_by_us_name', methods=['GET'])
  68. def get_data_by_us_name():
  69. us_id = request.args.get("id",type=int)
  70. us_data = User.query.get(us_id)
  71. if not us_data:
  72. status_code = 400
  73. result = {
  74. "msg":"Query failed! Please check the query username.",
  75. "us_data":{},
  76. "code":status_code
  77. }
  78. else:
  79. us_data_get = {
  80. "id":us_data.id,
  81. "username":us_data.username,
  82. "email":us_data.email
  83. }
  84. status_code = 200
  85. result = {
  86. "msg":"Query successful.",
  87. "us_data":us_data_get,
  88. "code":status_code
  89. }
  90. return jsonify(result), status_code

 web---user---__init__.py

  1. from flask import Blueprint
  2. user = Blueprint('user', __name__)
  3. from . import views

结束语

        Flask 是一个用 Python 编写的轻量级 Web 应用框架。它旨在提供一个简单、可扩展的基础,用于构建 Web 服务和 Web 应用程序。以上仅是一些简单使用的例子,能帮助你快上手并跑通。在工作实践还会遇到更多复杂的场景,比如token认证、复杂的sql查询等。如需了解更多关于flask的知识请阅读官方文档。

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/975412
推荐阅读
相关标签
  

闽ICP备14008679号