0

我正在使用django-rest-framework-jwt生成安全标记,但我需要在有人登录时使用标记获取用户信息。唯一的我已经看到这样做的方式是创建一个自定义函数,将覆盖默认功能。我对Django很新,所以我仍然试图弄清楚事情是如何工作的,这是我在阅读THIS文章后尝试的。我尝试了许多方法来实现这一目标,但这似乎是最好的方法。ImportError:试图导入自定义文件时 - Django JWT

问题我有,当我使用当前的设置,我得到:

ImportError: Could not import 'custom_jwt.jwt_response_payload_handler' for API setting 'JWT_PAYLOAD_HANDLER'. ImportError: No module named custom_jwt. 

1 - 创建custom_jwt.py是什么在哪里把它的最佳实践后?如果没有,有什么建议在哪里?

2-我将如何进入settings.py中的custom_jwt.py中的功能?

settings.py

JWT_AUTH = { 

    'JWT_PAYLOAD_HANDLER': 
    'custom_jwt.jwt_response_payload_handler', 

    'JWT_RESPONSE_PAYLOAD_HANDLER': 
    'custom_jwt.jwt_payload_handler', 
} 

custom_jwt.py

from datetime import datetime 
from calendar import timegm 
from rest_framework_jwt.settings import api_settings 


def jwt_payload_handler(user): 
    """ 
    Custom payload handler 
    Token encrypts the dictionary returned by this function, and can be decoded by rest_framework_jwt.utils.jwt_decode_handler 
    """ 
    return { 
     'user_id': user.pk, 
     'email': user.email, 
     'is_superuser': user.is_superuser, 
     'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA, 
     'orig_iat': timegm(
      datetime.utcnow().utctimetuple() 
     ) 
    } 


def jwt_response_payload_handler(token, user=None, request=None): 
    """ 
    Custom response payload handler. 
    This function controlls the custom payload after login or token refresh. This data is returned through the web API. 
    """ 
    return { 
     'token': token, 
     'user': { 
      'email': user.email, 
     } 
    } 

项目结构

project 
    account 
     __init__.py 
     admin.py 
     apps.py 
     managers.py 
     models.py 
     serializers.py 
     tests.py 
     views.py 
    core 
     __init__.py 
     settings.py 
     custom_jwt.py 
     urls.py 
     wsgi.py 
     db.sqlite3 

Python版本

Python 2.7.10 
+0

什么Python版本? –

+0

忘了包括 - Python 2.7.10 – Mike

+0

我看了site-packages> rest_framework_jwt> utils.py,看看我可以如何工作。我注意到我可能在错误的应用程序中使用了我的'custom_jwt.py',所以我将它移动到了'account',并更改了'settings.py',它的工作原理......一些。一个我得到它的工作,我会张贴我为未来偷看。 – Mike

回答

0

我最终将我的文件移动到account,该文件当时位于应用程序(模块)中。从我看到site-packages > rest_framework_jwt > utils.py我知道他们叫他们的档案utils.py,我觉得更多的是一个标准,所以我把custom_jwt.py更名为utils.py

settings.py

JWT_AUTH = { 
    """ 
    I found I did not need to change JWT_PAYLOAD_HANDLER 
    """ 
    'JWT_PAYLOAD_HANDLER': 
    'rest_framework_jwt.utils.jwt_payload_handler', 

    'JWT_RESPONSE_PAYLOAD_HANDLER': 
    'account.utils.jwt_response_payload_handler', 
} 

utils.py

# I created a custom User so I need to import the serializer 
from .serializers import UserSerializer 


def jwt_response_payload_handler(token, user=None, request=None): 
    """ 
    Custom response payload handler. 
    This function controls the custom payload after login or token refresh. This data is returned through the web API. 
    """ 

    return { 
     'token': token, 
     'user': UserSerializer(user, context={'request': request}).data 
    } 

所需的响应

{"token":"....", "user":{"id":1, "email": "[email protected]", "first": "test", "last": "guy"}}