重写 DRF 令牌认证
Rewriting DRF token auth
我想允许一个用户拥有多个令牌,因此决定重写令牌模型。结果创建
class TokenAuthentication(rest_framework.authentication.TokenAuthentication):
model = Token
在我的设置中添加到REST_FRAMEWORK
'DEFAULT_AUTHENTICATION_CLASSES': (
'users.authentication.TokenAuthentication',
)
也修改了
class ObtainAuthToken(APIView):
authentication_classes = ()
throttle_classes = ()
permission_classes = ()
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
renderer_classes = (renderers.JSONRenderer,)
serializer_class = AuthTokenSerializer
def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
name = serializer.validated_data['name']
token, created = Token.objects.get_or_create(user=user, name=name)
return Response({'token': token.key})
obtain_auth_token = ObtainAuthToken.as_view()
和 AuthTokenSerializer 到 return 名称
终于在url中得到了
url(r'^token-auth/', obtain_auth_token),
我认为一切都是正确的,但不断出现错误
File "/home/me/code/python/OCManager/core/users/authentication.py", line 4, in <module>
from rest_framework.views import APIView
ImportError: cannot import name 'APIView'
和
ImportError: Could not import 'users.authentication.TokenAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. ImportError: cannot import name 'APIView'.
有什么提示吗?
Token class修改是这样的:
class Token(rest_framework.authtoken.models.Token):
# key is no longer primary key, but still indexed and unique
key = models.CharField(_("Key"), max_length=40, db_index=True, unique=True)
# relation to user is a ForeignKey, so each user can have more than one token
user = models.ForeignKey(
settings.AUTH_USER_MODEL, related_name='auth_tokens',
on_delete=models.CASCADE, verbose_name=_("User")
)
name = models.CharField(_("Name"), max_length=64)
class Meta:
unique_together = (('user', 'name'),)
def __str__(self):
return self.user.username + " - " + self.name
我设法找到了问题所在。在同一个文件中使用 TokenAuth 扩展名会导致一些导入错误,似乎试图将其自身导入到其他文件中。解决方案正在移动
class TokenAuthentication(rest_framework.authentication.TokenAuthentication):
model = Token
到另一个文件
确保您从 rest_framework.authentication
而不是 rest_framework.authToken
导入了 TokenAuthentication
我一直在处理这个错误。事实证明,就像其他人所说的那样,它与代币有关。这不完全是一个“修复”,但它为我消除了错误:
我使用的是 simplejwt 并注释掉了导入:
from rest_framework_simplejwt.tokens import RefreshToken
并且还使用导入注释掉了函数。
此后我的错误得到解决。
我想允许一个用户拥有多个令牌,因此决定重写令牌模型。结果创建
class TokenAuthentication(rest_framework.authentication.TokenAuthentication):
model = Token
在我的设置中添加到REST_FRAMEWORK
'DEFAULT_AUTHENTICATION_CLASSES': (
'users.authentication.TokenAuthentication',
)
也修改了
class ObtainAuthToken(APIView):
authentication_classes = ()
throttle_classes = ()
permission_classes = ()
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
renderer_classes = (renderers.JSONRenderer,)
serializer_class = AuthTokenSerializer
def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
name = serializer.validated_data['name']
token, created = Token.objects.get_or_create(user=user, name=name)
return Response({'token': token.key})
obtain_auth_token = ObtainAuthToken.as_view()
和 AuthTokenSerializer 到 return 名称
终于在url中得到了
url(r'^token-auth/', obtain_auth_token),
我认为一切都是正确的,但不断出现错误
File "/home/me/code/python/OCManager/core/users/authentication.py", line 4, in <module>
from rest_framework.views import APIView
ImportError: cannot import name 'APIView'
和
ImportError: Could not import 'users.authentication.TokenAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. ImportError: cannot import name 'APIView'.
有什么提示吗?
Token class修改是这样的:
class Token(rest_framework.authtoken.models.Token):
# key is no longer primary key, but still indexed and unique
key = models.CharField(_("Key"), max_length=40, db_index=True, unique=True)
# relation to user is a ForeignKey, so each user can have more than one token
user = models.ForeignKey(
settings.AUTH_USER_MODEL, related_name='auth_tokens',
on_delete=models.CASCADE, verbose_name=_("User")
)
name = models.CharField(_("Name"), max_length=64)
class Meta:
unique_together = (('user', 'name'),)
def __str__(self):
return self.user.username + " - " + self.name
我设法找到了问题所在。在同一个文件中使用 TokenAuth 扩展名会导致一些导入错误,似乎试图将其自身导入到其他文件中。解决方案正在移动
class TokenAuthentication(rest_framework.authentication.TokenAuthentication):
model = Token
到另一个文件
确保您从 rest_framework.authentication
而不是 rest_framework.authToken
TokenAuthentication
我一直在处理这个错误。事实证明,就像其他人所说的那样,它与代币有关。这不完全是一个“修复”,但它为我消除了错误:
我使用的是 simplejwt 并注释掉了导入:
from rest_framework_simplejwt.tokens import RefreshToken
并且还使用导入注释掉了函数。
此后我的错误得到解决。