В документации здесь и здесь об этом расскаызвается.
Есть методы, которые могут в этом помочь:
add_url_rule(rule, endpoint=None, view_func=None, **options)
который работает как стандартный декоратор:
@app.route('/')
def index():
pass
что эквивалентно
def index():
pass
app.add_url_rule('/', 'index', index)
Если view_func
не указана, то так:
app.view_functions['index'] = index
С request.method
, соответственно так:
def index():
if request.method == 'OPTIONS':
# custom options handling here
...
return 'Hello World!'
index.provide_automatic_options = False
index.methods = ['GET', 'OPTIONS']
app.add_url_rule('/', index)
Если я Вас правильно понял, то это то, что Вам нужно. При генерации словаря, можно автоматически импортировать эксншы.
Вот так я автоматически импортирую Blueprints
:
def create_app():
...
register_routes(app)
...
return app
def register_routes(app):
"""Register routes."""
from . import controllers
from flask.blueprints import Blueprint
for module in _import_submodules_from_package(controllers):
bp = getattr(module, 'bp')
if bp and isinstance(bp, Blueprint):
app.register_blueprint(bp)
def _import_submodules_from_package(package):
import pkgutil
modules = []
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__,
prefix=package.__name__ + "."):
modules.append(__import__(modname, fromlist="dummy"))
return modules
А уже в самих Blueprints
можно реализовывать те самые экшны.
Так же, возможно, пригодится такой хелпер:
rules = {}
for endpoint, _rules in iteritems(app.url_map._rules_by_endpoint):
if any(item in endpoint for item in ['_debug_toolbar', 'debugtoolbar', 'static', 'admin']):
continue
rules[endpoint] = [{'rule': rule.rule} for rule in _rules]
Который позволяет легко получить урлы для последующего маппинга, с обходом debugtoolbar
, admin
и пр. , к примеру, для последующей генерации sitemap.
Или вот такая команда, для manage.py
, чтобы всегда можно было оперативно просмотреть, какие урлы сейчас зарегистрированы:
@manager.command
def list_routes():
import urllib.request
from flask import url_for
output = []
for rule in app.url_map.iter_rules():
options = {}
for arg in rule.arguments:
options[arg] = "[{0}]".format(arg)
methods = ','.join(rule.methods)
url = url_for(rule.endpoint, **options)
line = urllib.request.unquote("{:50s} {:20s} {}".format(rule.endpoint, methods, url))
for line in sorted(output):
print (line)