如何将 url_map.iter_rules 与蓝图对象一起使用而不是应用程序
How to use url_map.iter_rules with blueprint object instead of app
我有一个蓝图对象 "api" 和一个 apis.py 文件,其中我有许多使用 api.route 注释定义的 API。例如:
@api.route('/', methods=['GET'])
def get_info():
我想迭代并获取我拥有的所有 API 的摘要,这与我们在应用程序对象上使用 "url_map.iter_rules" 时所获得的相同。我们如何使用 api 蓝图对象来做到这一点?我已经使用
在我的 init.py 文件中注册了蓝图
from .api_1 import api as api_blueprint
app.register_blueprint(api_blueprint)
我认为如果您在注册蓝图后调用 app.url_map.iter_rules()
,您也会获得子域的所有端点,例如
api.py
from flask import Blueprint
api = Blueprint('api', __name__)
@api.route('/')
def call_api():
return ""
init.py:
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>]
如果您觉得它有用,我制作了一个函数,根据在主应用程序中注册的蓝图向我展示(仅用于测试)每个 url。
这是我发现的唯一能够打印端点的解决方案,这些端点通过它们所属的蓝图将它们分开。
当然,您可以创建一个函数,通过以字符串格式传递名称或蓝图本身来仅打印其中一个蓝图的 url_map 。
以下是示例:
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:
的蓝图的名称
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')
我有一个蓝图对象 "api" 和一个 apis.py 文件,其中我有许多使用 api.route 注释定义的 API。例如:
@api.route('/', methods=['GET'])
def get_info():
我想迭代并获取我拥有的所有 API 的摘要,这与我们在应用程序对象上使用 "url_map.iter_rules" 时所获得的相同。我们如何使用 api 蓝图对象来做到这一点?我已经使用
在我的 init.py 文件中注册了蓝图from .api_1 import api as api_blueprint
app.register_blueprint(api_blueprint)
我认为如果您在注册蓝图后调用 app.url_map.iter_rules()
,您也会获得子域的所有端点,例如
api.py
from flask import Blueprint
api = Blueprint('api', __name__)
@api.route('/')
def call_api():
return ""
init.py:
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>]
如果您觉得它有用,我制作了一个函数,根据在主应用程序中注册的蓝图向我展示(仅用于测试)每个 url。 这是我发现的唯一能够打印端点的解决方案,这些端点通过它们所属的蓝图将它们分开。 当然,您可以创建一个函数,通过以字符串格式传递名称或蓝图本身来仅打印其中一个蓝图的 url_map 。 以下是示例:
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:
的蓝图的名称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')