【发布时间】:2017-02-24 04:09:28
【问题描述】:
我正在开发一个带有蓝图的Flask 0.12 应用程序,我正在尝试使用Flask-JWT (0.3.2) 进行身份验证。
我看到的 Flask-JWT 教程都没有使用蓝图。
每个示例中通常都有一段代码,执行如下操作:
app = Flask(__name__)
jwt = JWT(app, authenticate, identity)
在蓝图烧瓶应用程序中,结构往往更像这样:
__init__.py:
from swarm.controllers.main import main
from swarm.controllers.grid import grid
from swarm.controllers.address import address
def create_app(object_name):
app = Flask(__name__)
...
app.register_blueprint(main)
app.register_blueprint(grid)
app.register_blueprint(address)
controllers/main.py:
main = Blueprint('main', __name__)
controllers/grid.py:
grid = Blueprint('grid', __name__)
controllers/address.py:
address = Blueprint('address', __name__)
如何引用Flask-JWT 并在控制器中使用它的装饰器?
通过展示如何将 JWT 装饰器添加到标准示例(例如烧瓶源代码中的 blueprintexample 或 Michał Karzyński's REST API demo),可能会更容易回答这个问题。
【问题讨论】:
-
蓝图只是让您能够围绕应用程序的概念块组织代码,它实际上与普通的 Flask 应用程序并没有什么不同。您在上面显示的来自
main.py, grid.py, address.py的代码应该放入__init__.py文件中,以使它们成为正确的python 模块。在您的主__init__.py文件中实例化 Flask-JWT,然后从您要使用的蓝图中导入它并装饰这些路由。我通常有一个 auth 蓝图,通过我的身份验证服务(使用 JWT)来管理登录、注销、回调等。 -
我不太明白为什么每个控制器都需要自己的 controllers/mycontroller/__init__.py 而不仅仅是 controllers/mycontroller.py
-
我已经尝试过你的方法,我的代码中似乎有循环引用。
-
例如,用这个 repo 进行了尝试:github.com/postrational/rest_api_demo,它使用这种方法陷入了一堆:
app.py: jwt = JWT(app, authenticate, identify)api/grid/endpoints/posts.py: from rest_api_demo.app import jwt -
新手注意事项:请改用 Flask-JWT-Extended,它位于 flask-jwt-extended.readthedocs.io/en/stable,最近已更新并有更好的文档。
标签: python-3.x flask flask-jwt