开发日常踩坑之 - - Flask中的蓝图(Blueprints)的 jwt装饰器(@jwt_required)陷害

199 阅读2分钟

问题

老规矩,先上代码:

from flask import Blueprint, request, session
from src.api.urlSet import MyEnum
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity, get_jwt

class sysTest():
    def __init__(self):
        self.bp = Blueprint("sys", __name__, url_prefix="/sys/")
        self.Myenum = MyEnum()
        

    self.bp.route(self.Myenum.route1, methods=['POST'])(self.route1)
    self.bp.route(self.Myenum.route2, methods=['GET'])(self.route2)
        
        
    @jwt_required
    def route1(): 
        pass 
        
    @jwt_required
    def route2(): 
        pass

看着很正常吧,但启动的时候 坑来了~

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/Users/project/venv/lib/python3.11/site-packages/flask/__main__.py", line 3, in <module>
    main()
  File "/Users/project/venv/lib/python3.11/site-packages/flask/cli.py", line 1064, in main
    cli.main()
  File "/Users/project/venv/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/click/decorators.py", line 92, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/flask/cli.py", line 912, in run_command
    raise e from None
  File "/Users/project/venv/lib/python3.11/site-packages/flask/cli.py", line 898, in run_command
    app = info.load_app()
          ^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/flask/cli.py", line 309, in load_app
    app = locate_app(import_name, name)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/flask/cli.py", line 219, in locate_app
    __import__(module_name)
  File "/Users/project/seoSysMange/app.py", line 55, in <module>
    app.register_blueprint(userService_bp)
  File "/Users/project/venv/lib/python3.11/site-packages/flask/sansio/scaffold.py", line 44, in wrapper_func
    return f(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/flask/sansio/app.py", line 597, in register_blueprint
    blueprint.register(self, options)
  File "/Users/project/venv/lib/python3.11/site-packages/flask/sansio/blueprints.py", line 335, in register
    deferred(state)
  File "/Users/project/venv/lib/python3.11/site-packages/flask/sansio/blueprints.py", line 431, in <lambda>
    lambda s: s.add_url_rule(
              ^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/flask/sansio/blueprints.py", line 110, in add_url_rule
    self.app.add_url_rule(
  File "/Users/project/venv/lib/python3.11/site-packages/flasgger/utils.py", line 980, in wrapper
    return f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/flask/sansio/scaffold.py", line 44, in wrapper_func
    return f(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/project/venv/lib/python3.11/site-packages/flask/sansio/app.py", line 659, in add_url_rule
    raise AssertionError(
AssertionError: View function mapping is overwriting an existing endpoint function: sys.wrapper

重点看:

AssertionError: View function mapping is overwriting an existing endpoint function: sys.wrapper

各种AI ,百度,Google 没有找到答案! 在 www.5axxw.com/questions/c… 找到 类似的bug ,但按照 这位大神 的方法,是无法解决我的问题的 呜呜~~~不过也在其中受到了启发

AI 给的答案 是

from flask import Blueprint bp = Blueprint("sysUser", __name__, url_prefix="/sys/user") def route1(): pass def route2(): pass bp.add_url_rule('/route1', view_func=route1, endpoint='route1') bp.add_url_rule('/route2', view_func=route2, endpoint='route2')

但我的 '/route1' 是从 Myenum 中读取的,所以 在保持 源码 的情况下解决问题的方法是:

from flask import Blueprint, request, session
from src.api.urlSet import MyEnum
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity, get_jwt

class sysTest():
    def __init__(self):
        self.bp = Blueprint("sys", __name__, url_prefix="/sys/")
        self.Myenum = MyEnum()
        

    self.bp.add_url_rule(self.Myenum.route1, methods=['POST'],
view_func=self.route1, endpoint='route1')
   self.bp.add_url_rule(self.Myenum.route2, methods=['GET'],
view_func=self.route2, endpoint='route2')
        
        
    @jwt_required
    def route1(): 
        pass 
        
    @jwt_required
    def route2(): 
        pass

呜呜~~~真是太难了~