Django возвращает изменение информации о пользователе

Я хочу изменить электронную почту пользователя (и другую информацию о нем)

Поэтому я создал для него маршрут:

@login_required
def change_email(request):
    email = request.POST['email']

    if email != request.user.email:
        request.user.email = email

    request.user.save()
    return JsonResponse({ 'message': 'Email updated' })

На фронтенде я получаю сообщение 'Email обновлен'. Когда после изменения я визуализирую шаблон с request.user.email, я вижу новый email, но после перезагрузки страницы снова появляется старое значение.

Я попытался вручную запросить пользователя с помощью refresh_from_db и ничего не получилось.

Я также пробовал проверять через страницу администратора, и когда я проверяю, значение ОБНОВЛЯЕТСЯ, а затем следующие запросы СТАНОВЯТСЯ обновленными. Поэтому я считаю, что это что-то связанное с кэшированием и когда я вручную просматриваю кэш, он обновляется правильно?

В вашем коде есть несколько проблем:
A) Функция always возвращает "Email обновлен".
Б) Нет обработки для случая, когда request.user.save() ошибочен.

Измените его следующим образом:

@login_required
def change_email(request):
    if request.method == 'GET':
        return JsonResponse({ 'message': 'No get request allowed' })

    email = request.POST['email']

    if email == request.user.email:
        return JsonResponse({ 'message': 'Email already saved' })        

    request.user.email = email
    try:
        request.user.save()
    except Exception as e:
        return JsonResponse({'error': str(e)}, status=500)
    
    return JsonResponse({ 'message': 'Email updated' })

Это должно помочь дать больше информации о том, что происходит. Код все еще далек от совершенства: ему не хватает проверки электронной почты, защиты csrf и обработки случая GET-запроса. Вам также следует добавить соответствующие коды ошибок, например JsonResponse({'message': 'Email updated'}, status=200)

Я нашел решение.

При изменении пользователя AsyncWebsocketConsumer некорректно обновляется self.scope['user'].

В моем случае я использовал websocket для отправки статуса онлайн/оффлайн в режиме реального времени другим пользователям.

После обновления электронной почты и обновления страницы, пользователь отключается, устанавливает user.status = 'Offline' и сохраняет, проблема в том, что этот пользователь из websocket был старым пользователем, до изменений, и это сохранение перезаписывает все.

Вернуться на верх