【问题标题】:Where can I override jwt_response_payload_handler method?我在哪里可以覆盖 jwt_response_payload_handler 方法?
【发布时间】:2015-06-10 09:50:29
【问题描述】:

我已经用 pip 安装了 JWT。现在我想重写方法

def jwt_response_payload_handler(token, user=None, request=None):
    return { 'token': token, }

成为

def jwt_response_payload_handler(token, user=None):
    return {
        'token': token,
        'user': UserSerializer(user).data
    }

我应该在哪里覆盖它?我是否在自己的应用程序中覆盖该方法,但在哪里以及如何?还是我修改库中的原始代码?

我已经修改了库中的方法,它工作正常,但我认为这不是正确的做法。有人能帮我吗?谢谢

【问题讨论】:

    标签: python django django-rest-framework jwt


    【解决方案1】:

    我发现成功执行了以下操作:

    myapp.view.py 文件:

    def jwt_response_payload_handler(token, user=None, request=None):
        return {
            'token': token,
            'bunny': 'fu fu'
        }
    

    setting.py 文件:

    JWT_AUTH = {
        'JWT_RESPONSE_PAYLOAD_HANDLER':
        #'rest_framework_jwt.utils.jwt_response_payload_handler',
        'myapp.views.jwt_response_payload_handler',
    }
    

    在任意位置实现函数jwt_response_payload_handler,但请确保它位于您的python 路径中。例如在这个文件中:myapp.views.py

    然后在您的 settings.py 文件中,将 JWT_AUTH 字典键 JWT_RESPONSE_PAYLOAD_HANDLER 更新为您刚刚创建的 jwt_response_payload_handler 的新位置。

    一旦掌握了发生的情况,您就可以根据需要调整解决方案。例如,我不建议将您的覆盖函数留在 views.py 文件中。只是为了演示目的更简单。

    也许将jwt_response_payload_handler 函数放在您创建的“helper.py”文件中是一个简单的解决方案。

    【讨论】:

    • 这对我帮助很大。它很简单,并且清楚地写在文档中,但我无法理解那里。谢谢。
    • 针对 2018 年遇到此问题的任何人的更新。您必须有 'JWT_PAYLOAD_GET_USER_ID_HANDLER': 'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',也在 JWT_AUTH 中,否则覆盖将不起作用。
    • @JohnZ 感谢约翰的更新。如果您创建编辑,我会批准它。
    • 它仍然对我不起作用。使用 Django 2 不确定是否重要。
    【解决方案2】:
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    payload = jwt_payload_handler(user)
    token = jwt_encode_handler(payload)
    

    【讨论】:

      【解决方案3】:

      创建自己的处理程序方法后,您必须在 JWT_AUTH 设置中更改它。查看文档中的Additional Settings 部分。

      【讨论】:

      • 问题是我应该在哪里创建自己的处理程序方法?在我自己的应用程序或 JWT 库中?我可以修改库,然后它就可以工作了。我不确定是否应该这样做,修改库中的文件?
      • @song 处理程序方法可用于 sys.path 的任何可用位置,通常项目内的任何位置都可以,例如:'my_project.utils.jwt_response_payload_handler'
      • 如果您想按应用编辑设置怎么办?例如。我有一个面向内部的 API,我不想使用刷新令牌,所以我的设置是:JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=12), }。但我也有一个面向消费者的 api,我希望设置为JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300), 'JWT_ALLOW_REFRESH': True, 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(hours=12) }。我如何让视图识别每个应用程序中的不同设置。
      猜你喜欢
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多