我正在使用 rest-framework-jwt,只是想了解一些事情。
首先,我使用电子邮件和密码进行登录,并获得 token 。它运行良好。
但我也想在我的寄存器中创建一个 token 。所以,我使用这个函数:
def create_token(user):
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)
return token
问题是我没有用户名。所以,它不起作用。 :) 我想,如果它适用于登录,它应该适用于注册。但不是。 :笑脸:
即使我在我的模型中写了这个 USERNAME_FIELD = 'email'
。它总是在我的 create_token
函数中询问用户名。
但其次,我想创建仅包含电子邮件、密码和 uuid 的 token
第三...我的注册和登录中的 token 相同吗?要发出请求,它应该是相同的。
谢谢!
最佳答案
我找到了答案。
我读了这个doc并意识到我只需要重新定义这些功能。就我而言,我更喜欢覆盖 jwt_playload_handler
因此,我将该函数添加到一个名为 utils.py 的文件中,它看起来是这样的:
from calendar import timegm
from datetime import datetime
from rest_framework_jwt.compat import get_username_field
from rest_framework_jwt.settings import api_settings
def jwt_payload_handler(user):
username_field = get_username_field()
print(user['uuid'])
payload = {'user_id': user['uuid'], 'email': user['email'], 'username': user['email'],
'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA, username_field: user['email']}
# Include original issued at time for a brand new token,
# to allow token refresh
if api_settings.JWT_ALLOW_REFRESH:
payload['orig_iat'] = timegm(
datetime.utcnow().utctimetuple()
)
if api_settings.JWT_AUDIENCE is not None:
payload['aud'] = api_settings.JWT_AUDIENCE
if api_settings.JWT_ISSUER is not None:
payload['iss'] = api_settings.JWT_ISSUER
return payload
然后,在 settings.py 中
JWT_AUTH = {
'JWT_PAYLOAD_HANDLER':
'users.utils.jwt_payload_handler',
}
说起来,它应该承担我的职能。
在我看来:
def create_token(user):
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)
return token
就是这样
关于python - 使用 Rest-Framework-Jwt 创建 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41623751/