Flask 蓝图嵌套

版权声明:本文为博主原创文章,转载请注明出处。

前言

Flask是一个轻量级的python web框架,与django相比,flask抛开了繁琐的配置项等等。

Flask与Django一样,支持模块化开发,使用BluePrint(蓝图)实现。

但是,这个蓝图并不支持嵌套。。

正文

当然,我能想到的问题早就有人想到,并解决了。

详情见issue.

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class NestableBlueprint(Blueprint):
"""
Hacking in support for nesting blueprints, until hopefully https://github.com/mitsuhiko/flask/issues/593 will be resolved
"""

def register_blueprint(self, blueprint, **options):
def deferred(state):
url_prefix = (state.url_prefix or u"") + (options.get('url_prefix', blueprint.url_prefix) or u"")
if 'url_prefix' in options:
del options['url_prefix']

state.app.register_blueprint(blueprint, url_prefix=url_prefix, **options)

self.record(deferred)

使用方法

以下为从我的flask demo里复制出来的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from flask import Blueprint

from ..libs.nestable_blueprint import NestableBlueprint

exam = NestableBlueprint('exam', __name__, template_folder='templates', static_folder='static')
exam_admin = NestableBlueprint('exam.admin', __name__, template_folder='templates', static_folder='static')
exam_admin_category = Blueprint('exam.admin.category', __name__, template_folder='templates', static_folder='static')
exam_admin_question = Blueprint('exam.admin.question', __name__, template_folder='templates', static_folder='static')

exam_admin.register_blueprint(exam_admin_category, url_prefix='/category')
exam_admin.register_blueprint(exam_admin_question, url_prefix='/question')
exam.register_blueprint(exam_admin, url_prefix='/admin')

exam_category = Blueprint('exam.category', __name__, template_folder='templates', static_folder='static')
exam_question = Blueprint('exam.question', __name__, template_folder='templates', static_folder='static')

exam.register_blueprint(exam_category, url_prefix='/category')
exam.register_blueprint(exam_question, url_prefix='/question')

from . import views, models
from .admin.category import views
from .admin.question import views

from .category import views

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×