首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用url_map.iter_rules与蓝图对象代替app

如何使用url_map.iter_rules与蓝图对象代替app
EN

Stack Overflow用户
提问于 2016-04-12 05:11:05
回答 2查看 3K关注 0票数 2

我有一个蓝图对象"api“和一个apis.py文件,其中有许多用api.route注释定义的api。例:

代码语言:javascript
运行
复制
@api.route('/', methods=['GET'])
def get_info():

我想迭代并获得所有app的摘要,这些app与我们在app对象上使用"url_map.iter_rules“时得到的app相同。我们如何使用api蓝图对象来完成这个任务?我已经在我的init.py文件中注册了蓝图

代码语言:javascript
运行
复制
from .api_1 import api as api_blueprint
app.register_blueprint(api_blueprint)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-12 06:08:45

我认为,如果您在注册蓝图之后调用app.url_map.iter_rules(),您也会得到子域的所有端点。

api.py

代码语言:javascript
运行
复制
from flask import Blueprint
api = Blueprint('api', __name__)
@api.route('/')
def call_api():
        return ""

init.py:

代码语言:javascript
运行
复制
from flask import Flask, Blueprint
from api import api

public = Blueprint('public', __name__)
@public.route('/')
def home():
        return render_template('public/home.html')


app = Flask(__name__)
app.register_blueprint(public)
app.register_blueprint(api, subdomain='api')
print(list(app.url_map.iter_rules()))

[<Rule 'api|/' (GET, HEAD, OPTIONS) -> api.call_api>,
 <Rule '/' (GET, HEAD, OPTIONS) -> public.home>,
 <Rule '/static/<filename>' (GET, HEAD, OPTIONS) -> static>]
票数 3
EN

Stack Overflow用户

发布于 2021-06-13 18:46:46

如果您发现它有用,我创建了一个函数,根据主应用程序中注册的蓝图显示(仅用于测试)每个url。这是我找到的唯一能够打印端点的解决方案,通过它们所属的蓝图将它们分开。当然,您可以创建一个函数,通过传递字符串格式的名称或蓝图本身,只打印其中一个蓝图的url_map。以下是一些例子:

代码语言:javascript
运行
复制
from flask.logging import create_logger
def log_routes(app: Flask):

    log = create_logger(app)

    with app.app_context():
        """
        Maps every single endpoint for blueprint registered in the main application.
        Also shows methos available for each endpoint
        """

        log.info('MAP ROUTER')
        bps = app.blueprints
        for bp in bps:
            print('', end='\n')
            log.info(f'BLUEPRINT RULES: "{bp}"')
            for ep in app.url_map.iter_rules():
                bp_name = ep.endpoint.split('.')[0]
                if bp_name == bp:
                    log.debug(f'Endpoint: {ep} methods={ep.methods}')

下面是一个函数的示例,该函数只接受需要从中获取其url_map的蓝图的名称:

代码语言:javascript
运行
复制
def log_blueprint_urls(app: Flask, bp_name: str):

    log = create_logger(app)

    with app.app_context():
        """
        Maps every single endpoint for an specific blueprint in the main application.
        Also shows methos available for each endpoint
        """
        bps = app.blueprints
        if bp_name in bps:
            log.info(f'MAP ROUTER FOR BLUEPRINT "{bp_name}"')

            for ep in app.url_map.iter_rules():
                bp_name = ep.endpoint.split('.')[0]
                if bp_name == bp_name:
                    log.debug(f'Endpoint: {ep} methods={ep.methods}')
        else:
            log.critical(
                f'BLUEPRINT "{bp_name}" has not registered in main application')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36564080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档