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)

 

posted @ 2024-10-10 11:19  马铃薯1  阅读(23)  评论(0编辑  收藏  举报