05-蓝图(Blueprints)
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是关键字还是isbn isbn_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的值,获取相应的url if 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), 200 def 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 if __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 datetime from 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) 创建蓝图
初始化 app/web/__init__.py
# 蓝图 blueprint 蓝本 from flask import Blueprint web = Blueprint('web', __name__) from app.web import book
指定路由和视图函数 app/web/book.py
from flask import jsonify, Blueprint from httpTest import HTTP from . import web # # 蓝图 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是关键字还是isbn isbn_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的值,获取相应的url if 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), 200 def 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 requests class HTTP: # 发送GET请求 @staticmethod def get(url, return_json=True): response = requests.get(url) if response.status_code == 200: if return_json: return response.json() else: return response.text else: print(f"Error: {response.status_code}") return None # 发送POST请求 @staticmethod def 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.text else: print(f"Error: {response.status_code}") return None
2) 注册蓝图,在初始化中实例化flask对象,并注册蓝图
初始化 app/__init__.py
from flask import Flask from app.web import web def create_app(): # 实例化flask对象 app = Flask(__name__) # flask对象加载配置文件 app.config.from_object('config') # 调用注册蓝图的方法 register_blueprint(app) return app def register_blueprint(app): # 注册蓝图 app.register_blueprint(web)