Flask 的蓝图(Blueprints)是一种组织代码的机制,允许你将 Flask 应用分解成多个模块。这样可以更好地组织应用逻辑,使得应用更具可维护性和可扩展性。
每个蓝图可以有自己的路由、视图函数、模板和静态文件,这样可以将相关的功能分组。
通过使用蓝图,你可以将 Flask 应用拆分成多个模块,每个模块处理相关的功能,使得代码更加清晰和易于管理。
- 创建蓝图:在独立的模块中定义蓝图,并指定路由和视图函数。
-
注册蓝图:在主应用中注册蓝图,并设置路由前缀。
-
使用蓝图中的模板和静态文件:将模板和静态文件放在蓝图的
templates
和static
文件夹中。 -
使用请求钩子和错误处理:在蓝图中定义请求钩子和错误处理函数。
单文件Flask应用 fisher.py
from flask import Flask, make_response, jsonify from httpTest import HTTP# 实例化flask对象 app = Flask(__name__)# 关键字搜索:http://t.talelin.com/v2/book/search?q={}&start={}&count={} # isbn搜索: http://t.talelin.com/v2/book/isbn/{isbn} @app.route('/book/search/<q>') def search(q):""":param q: 普通关键字 isbn:param page: 分页:return:"""# 调用is_isbn_or_key方法,判断q是关键字还是isbnisbn_or_key = is_isbn_or_key(q)isbn_url = "http://t.talelin.com/v2/book/isbn/{}"key_url = "http://t.talelin.com/v2/book/search?q={}&start={}&count={}"# 根据isbn_or_key的值,获取相应的urlif isbn_or_key == "isbn":url = isbn_url.format(q)result = HTTP.get(url)else:url = key_url.format(q, 1, 5)result = HTTP.get(url)return jsonify(result), 200def is_isbn_or_key(q):# 默认q为关键字isbn_or_key = "key"# 判断q是否为isbn# isbn13 是由13位0到9数字组成的字符串# isbn10 是由10位0到9数字组成,含有一些 "-"if q.isdigit() and len(q) == 13:isbn_or_key = "isbn"short_q = q.replace("-", "")if q.isdigit() and len(short_q) == 10 and q in "-":isbn_or_key = "isbn"return isbn_or_keyif __name__ == '__main__':app.run(host="0.0.0.0", debug=True, port=5000)
使用蓝图将Flask应用进行分解
项目结构
配置文件 config.py
# 配置参数 DEBUG = True
入口文件 fisher2.py
from flask import Flask, make_response, jsonify from datetime import datetimefrom app import create_app# 创建flask对象 app = create_app()if __name__ == '__main__':app.run(host= '0.0.0.0', debug=app.config['DEBUG'], port=5000)
1) 创建蓝图,并指定路由和视图函数 book.py
# 蓝图 blueprint 蓝本from flask import jsonify, Blueprint from httpTest import HTTP# 蓝图 blueprint 蓝本 web = Blueprint('web', __name__)# 关键字搜索:http://t.talelin.com/v2/book/search?q={}&start={}&count={} # isbn搜索: http://t.talelin.com/v2/book/isbn/{isbn} # @app.route('/book/search/<q>') # 通过蓝图注册视图函数 @web.route('/book/search/<q>') def search(q):""":param q: 普通关键字 isbn:param page: 分页:return:"""# 调用is_isbn_or_key方法,判断q是关键字还是isbnisbn_or_key = is_isbn_or_key(q)isbn_url = "http://t.talelin.com/v2/book/isbn/{}"key_url = "http://t.talelin.com/v2/book/search?q={}&start={}&count={}"# 根据isbn_or_key的值,获取相应的urlif isbn_or_key == "isbn":url = isbn_url.format(q)result = HTTP.get(url)else:url = key_url.format(q, 1, 5)result = HTTP.get(url)return jsonify(result), 200def is_isbn_or_key(q):# 默认q为关键字isbn_or_key = "key"# 判断q是否为isbn# isbn13 是由13位0到9数字组成的字符串# isbn10 是由10位0到9数字组成,含有一些 "-"if q.isdigit() and len(q) == 13:isbn_or_key = "isbn"short_q = q.replace("-", "")if q.isdigit() and len(short_q) == 10 and q in "-":isbn_or_key = "isbn"return isbn_or_key
视图函数文件 httpTest.py
import requestsclass HTTP:# 发送GET请求 @staticmethoddef get(url, return_json=True):response = requests.get(url)if response.status_code == 200:if return_json:return response.json()else:return response.textelse:print(f"Error: {response.status_code}")return None# 发送POST请求 @staticmethoddef post(url, data, headers={}, return_json=True):response = requests.post(url, data=data, headers=headers)if response.status_code == 200:if return_json:return response.json()else:return response.textelse:print(f"Error: {response.status_code}")return None
2) 注册蓝图,在初始化中实例化flask对象,并注册蓝图 app/__init__.py
from flask import Flask from app.web.book import webdef create_app():# 实例化flask对象app = Flask(__name__)# flask对象加载配置文件app.config.from_object('config')# 调用注册蓝图的方法 register_blueprint(app)return appdef register_blueprint(app):# 注册蓝图app.register_blueprint(web)