Как решить проблему с Django 3, которая сбрасывает сеанс пользователя, когда он получает данные POST с внешней страницы - PullRequest
1 голос
/ 30 апреля 2020

Мой путь URL в проекте url.py определяется следующим образом:

path('endpoint/', views.Endpoint.as_view(), name='get_endpoint'),

views.py включает следующий класс для обработки этой маршрутизации:

@method_decorator(csrf_exempt, name='dispatch') 
class Endpoint(View):
    def get(self, request, *args, **kwargs):
        ############ Here I can see the User Session ##########
        if not request.user.is_authenticated:
            return redirect('authentication_router')

        return redirect(
            'https://app.globus.org/file-manager?method=POST&action=%s&cancelurl=%s&folderlimit=1&filelimit=0&label=%s'
            % (
            request.build_absolute_uri(), "/", "To Transfer your Files Select the Folder first!")
        )

    def post(self, request, *args, **kwargs):  # On return from OAuth Page
        ############ Here, User Session return nothing so user is AnonymousUser ##########
        if request.POST.get('folder[0]'):  # A Endpoint folder was selected
            endpoint_path = os.path.join(request.POST.get('path'), request.POST.get('folder[0]'))
        else:
            endpoint_path = request.POST.get('path')     

        profile = request.user.userprofile # request.user does not has userprofile
        profile.endpoint_path = endpoint_path
        profile.save()

        return HttpResponseRedirect(reverse('authentication_router'))

Проблема заключается в когда вызывается get, он находит значение request.user как аутентифицированного пользователя, но как только перенаправление со страницы OAUTH с POST достигает класса, он теряет весь пользовательский сеанс запроса и выдает ошибку в этой строке:

profile = request.user.userprofile

As , request.user кажется потерянным в своем сеансе и имеет значение AnonymousUser, хотя до GET метода он сохраняет значения сеанса входа пользователя.

Мой settings.py файл включает в себя:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    **'django.contrib.sessions',**
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'myapp',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    **'django.contrib.auth.middleware.AuthenticationMiddleware',**
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Я тестирую его на localhost: 8000. Пожалуйста, дайте мне знать, что мне не хватает этого кода. Тот же код отлично работает в Django 1.8 и Python 2.7. В последнее время я пытаюсь обновить его для работы с Django 3 и Python 3. Единственное отличие, которое я вижу, в settings.py в Django 1.8 версии включает в себя: 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', в MIDDLEWARE_CLASSES, который удален в последняя версия Django.

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