藍圖
簡單地在app上寫入路由很方便,但是管理一個大的項目的時候有困難在與路由創建的時候的不同時的,會導致xxxx問題,用藍圖能很好地解決這個問題。藍圖創建之后不會馬上寫入到路由里面,而是要在app上注冊才可以成為一個可用的路由接口。register_blueprint()。
藍圖創建
from flask import Blueprint
bp = Blueprint('simple_name', __name__)
@bp.route('/xxxxx')
def xxxxx():
# your code
return render_templates()
參數介紹:
- 第一個參數是藍圖的名字,藍圖在注冊的時候路由會記錄每個藍圖的名字,如果有重復出現的名字就會拋出異常。
- 第二個參數是module的名字,這個最好是
__name__
保持這樣就行,藍圖會記錄模塊的名字
注冊藍圖
from flask import Flask
from yourapplication.simple_page import simple_page
app = Flask(__name__)
app.register_blueprint(simple_page)
可以看出用藍圖寫app的時候可以很方便的管理每個api,在構件大項目的時候非常有用。
注冊藍圖方法的代碼
@setupmethod
def register_blueprint(self, blueprint, **options):
"""Registers a blueprint on the application.
.. versionadded:: 0.7
"""
first_registration = False
if blueprint.name in self.blueprints:
assert self.blueprints[blueprint.name] is blueprint, \
'A blueprint\'s name collision occurred between %r and ' \
'%r. Both share the same name "%s". Blueprints that ' \
'are created on the fly need unique names.' % \
(blueprint, self.blueprints[blueprint.name], blueprint.name)
else:
self.blueprints[blueprint.name] = blueprint
self._blueprint_order.append(blueprint)
first_registration = True
blueprint.register(self, options, first_registration)
在注冊藍圖的時候用到的閉包方法
def setupmethod(f):
"""Wraps a method so that it performs a check in debug mode if the
first request was already handled.
"""
def wrapper_func(self, *args, **kwargs):
if self.debug and self._got_first_request:
raise AssertionError('A setup function was called after the '
'first request was handled. This usually indicates a bug '
'in the application where a module was not imported '
'and decorators or other functionality was called too late.\n'
'To fix this make sure to import all your view modules, '
'database models and everything related at a central place '
'before the application starts serving requests.')
return f(self, *args, **kwargs)
return update_wrapper(wrapper_func, f)
def update_wrapper(wrapper,
wrapped,
assigned = WRAPPER_ASSIGNMENTS,
updated = WRAPPER_UPDATES):
"""Update a wrapper function to look like the wrapped function
wrapper is the function to be updated
wrapped is the original function
assigned is a tuple naming the attributes assigned directly
from the wrapped function to the wrapper function (defaults to
functools.WRAPPER_ASSIGNMENTS)
updated is a tuple naming the attributes of the wrapper that
are updated with the corresponding attribute from the wrapped
function (defaults to functools.WRAPPER_UPDATES)
"""
for attr in assigned:
setattr(wrapper, attr, getattr(wrapped, attr))
for attr in updated:
getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
# Return the wrapper so this can be used as a decorator via partial()
return wrapper