Получение WrappedAttributeError при входе на сайт с недавно установленной djangorestframework - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть веб-сайт, который имеет функцию входа пользователя и работает нормально. Мне пришлось установить django rest framework и следовать самым простым инструкциям на первой странице. Кажется, все нормально, и остальные фреймворки работают нормально, но как только я захожу в свой django и возвращаюсь к остальным фреймворкам, он выходит из строя с этой ошибкой:

WrappedAttributeError at /rest-api/
'CSRFCheck' object has no attribute 'process_request'

Я понятия не имею, почему это происходит или что это значит. Поиск не помог.

Редактировать: Место исключения:

python3.6/site-packages/rest_framework/authentication.py in enforce_csrf, line 140

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я создал проблему, чтобы сообщить об этом: https://github.com/encode/django-rest-framework/issues/6305

Вы можете увидеть исправление здесь, если вам нужен патч быстро: https://github.com/encode/django-rest-framework/pull/6306/files

Подробнее

В выпуске Django Rest Framework 3.9 был введен новый вызов функции в процессе аутентификации:

check = CSRFCheck()
check.process_request(request)

CSRFCheck - это класс, импортированный непосредственно из Django. Метод process_request класса CSRFCheck был добавлен только в версии Django 1.11.6 (и сохранился после этого). Поэтому версия 3.9.0 Django Rest Framework не полностью совместима с Django 1.11.x, но только с 1.11.6 и выше. Существует много решений этой проблемы:

  • Обновление до Django 1.11.6 или выше, если возможно
  • Форк Django Rest Framework и включение следующего патча в метод empce_csrf класса SessionAuthentication (rest_framework / authentication.py):

    from django import VERSION as django_version
    
    if tuple(django_version[:3]) < (1, 11, 6):
        csrf_token = check._get_token(request)
        if csrf_token is not None:
            request.META['CSRF_COOKIE'] = csrf_token
    else:
        check.process_request(request)
    

Этот патч будет работать для любой версии Django от 1.11.x и выше (по крайней мере, Django 2.0 и 2.1).

Надеюсь, мой патч будет объединен и выпущен в версии 3.9.1 Django Rest Framework. Также имейте в виду, что версия 3.9.0, вероятно, является одной из последних версий, поддерживающих Django 1.11.

0 голосов
/ 04 ноября 2018

Это похоже на эту проблему , которая была исправлена ​​и в версии 3.8.2 DRF.

Вот те вещи, которые я бы попробовал:

  1. Убедитесь, что ваш Django обновлен как минимум до 1.11, а DRF обновлен как минимум до 3.8.2.
  2. Убедитесь, что вы добавили rest_framework к нижней части вашего INSTALLED_APPS. Это легко пропустить в руководстве по установке.
  3. Убедитесь, что ваш MIDDLEWARE в settings.py относительно нетронут, если это новый проект. По крайней мере, убедитесь, что django.middleware.csrf.CsrfViewMiddleware есть, и если над ним есть какое-либо промежуточное программное обеспечение, не относящееся к Django, попробуйте переместить его как можно ниже.

Если ничего из этого не работает, вы можете попробовать усечь таблицу django_session, если вы используете сеансовую аутентификацию. Я не думаю, что это поможет, но стоит попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...