【问题标题】:flask MethodView with decorators is giving error带有装饰器的烧瓶 MethodView 给出错误
【发布时间】:2019-12-13 04:12:43
【问题描述】:

也许我做错了什么。我正在尝试使用flask-security-too auth_required 和flask 的MethodView,如https://flask.palletsprojects.com/en/1.1.x/views/#decorating-views 所述,当我尝试访问该页面时会引发异常。蟒蛇3.6.8

from flask_security import auth_required

class RunningRoutesAdmin(MethodView):
    decorators = [auth_required]

    def get(self):
        return render_template('admin.jinja2',
                               pagename='Admin Home')

admin_view = RunningRoutesAdmin.as_view('admin')
app.add_url_rule('/admin/', view_func=admin_view, methods=['GET',])

异常

Traceback (most recent call last):
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\lking\Documents\Lou's Software\projects\runningroutes\runningroutes\venv\lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
TypeError: wrapper() missing 1 required positional argument: 'fn'

【问题讨论】:

  • 我不认为你做错了什么。我只是复制了它。问题是 @auth_required 是一个“双重包装”装饰器。我正在寻找一种解决方法。

标签: python flask flask-security


【解决方案1】:

好的 - 简单的解决方案 - 因为 auth_required 需要参数 - 你需要:

decorators = [auth_required()]

抱歉 - 我建议传入 None - 这当然是不正确的。不传递任何内容或传递可接受的方法列表(例如“会话”、“令牌”)都可以正常工作。

【讨论】:

  • 嗯,通过此更改,即使我已登录,它似乎总是将我发送到登录页面。即使在我重新登录后,我也会返回带有 url @ 的登录页面987654321@
  • 刚刚注意到您的更新 - 没有传入任何内容都可以正常工作。不完全确定您所说的可接受方法列表是什么意思。你的意思是像“get”,MethodView 方法的字符串?还是get 方法本身?
  • 我应该在flask-security-too 中写一个问题来阐明装饰器在MethodView 中的使用吗?
  • 如此处所述:flask-security-too.readthedocs.io/en/stable/…。 auth_required 装饰器采用允许的 auth_methods 列表(如“会话”、“令牌”)。虽然它也让我感到困惑 - 这是基本的 python 装饰器用法 - 如果装饰器接受一个参数(而不仅仅是要包装的隐式函数) - 那么你需要传递这些参数 - 就像你在行中这样做一样:auth_required ("会话")(-my-func-)
  • 哦,auth 方法而不是类方法。知道了。再次感谢!
猜你喜欢
  • 2017-05-29
  • 2018-08-11
  • 2012-07-14
  • 2021-04-06
  • 2018-03-28
  • 2016-03-11
  • 2016-02-21
  • 2020-09-20
  • 1970-01-01
相关资源
最近更新 更多