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 был старым пользователем, до изменений, и это сохранение перезаписывает все.