Django Rest Framework JWT - OperationalError: нет такой таблицы: auth_user - PullRequest
0 голосов
/ 28 января 2019

Я разрабатываю приложение Django для Windows с Pyhton 2.7.15.Мне нужно реализовать механизм аутентификации с Django Rest framework JWT , где мне просто нужно проверить токен (а не генерировать его).Полезная нагрузка токена выглядит примерно так:

Полезная нагрузка

{
  "iss": "customIssuer",
  "username": "customUser"
}

По этой причине я настраиваю setting.py следующим образом:

...

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.TokenAuthentication'
    ),
}

JWT_AUTH = {
    'JWT_ISSUER': 'customIssuer'
}

...

и мой urls.py таким образом:

...

from rest_framework_jwt.views import verify_jwt_token

urlpatterns = [
    ...
    url(r'^api-token-verify/', verify_jwt_token),
    ...
]

Затем, если я пытаюсь отправить запрос POST с указанным выше токеном, я получаю эту ошибку:

Traceback (most recent call last):
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Software\Workspace\py2_env\lib\site-packages\rest_framework\views.py", line 489, in dispatch
    response = self.handle_exception(exc)
  File "C:\Software\Workspace\py2_env\lib\site-packages\rest_framework\views.py", line 449, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Software\Workspace\py2_env\lib\site-packages\rest_framework\views.py", line 486, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\Software\Workspace\py2_env\lib\site-packages\rest_framework_jwt\views.py", line 57, in post
    if serializer.is_valid():
  File "C:\Software\Workspace\py2_env\lib\site-packages\rest_framework\serializers.py", line 237, in is_valid
    self._validated_data = self.run_validation(self.initial_data)
  File "C:\Software\Workspace\py2_env\lib\site-packages\rest_framework\serializers.py", line 435, in run_validation
    value = self.validate(value)
  File "C:\Software\Workspace\py2_env\lib\site-packages\rest_framework_jwt\serializers.py", line 130, in validate
    user = self._check_user(payload=payload)
  File "C:\Software\Workspace\py2_env\lib\site-packages\rest_framework_jwt\serializers.py", line 109, in _check_user
    user = User.objects.get_by_natural_key(username)
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\contrib\auth\base_user.py", line 48, in get_by_natural_key
    return self.get(**{self.model.USERNAME_FIELD: username})
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\db\models\query.py", line 374, in get
    num = len(clone)
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\db\models\query.py", line 232, in __len__
    self._fetch_all()
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\db\models\query.py", line 1105, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\db\models\query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  File "C:\Software\Workspace\py2_env\lib\site-packages\django\db\models\sql\compiler.py", line 886, in execute_sql
    raise original_exception
OperationalError: no such table: auth_user

Проверяя пакет "rest framework jwt", я замечаю, что эта ошибка выбрасывается serializers.py.В частности, из метода check_user:

def _check_user(self, payload):

    username = jwt_get_username_from_payload(payload)

    if not username:
        msg = _('Invalid payload.')
        raise serializers.ValidationError(msg)

    # Make sure user exists
    try:
        user = User.objects.get_by_natural_key(username) ## ERROR!!!!
    except User.DoesNotExist:
        msg = _("User doesn't exist.")
        raise serializers.ValidationError(msg)

    if not user.is_active:
        msg = _('User account is disabled.')
        raise serializers.ValidationError(msg)

    return user
...