Переменная сессии не обновляется в django, принимая только первое значение
это представление, которое отправляет код подтверждения на электронную почту, при каждом выполнении генерирует новый код-сбрасывает переменную идеально
def codeSender(request,user):
code = random.randint(100000, 999999)
request.session['reset_code'] = code
request.session.save()
print(request.session['reset_code'])
# will print a new code each time this view is being executed
request.session['user'] = user.pk
subject = "Password reset"
message = render_to_string('authentication/emailResetPassword.html', {'code': code})
email = EmailMessage(
subject,
message,
settings.EMAIL_HOST_USER,
to=[user.email]
)
email.send()
предполагается, что это представление будет принимать значение проверки имени пользователя, если оно существует, а затем вызывать представление codeSender(), возвращая json-ответ, указывающий, что будет показана форма подтверждения кода
def resetPassword(request):
if request.method == 'POST':
form_name = request.POST.get('form_name')
if form_name == "form1":
username = request.POST["username"]
userQuery = User.objects.filter(username=username)
if not userQuery.exists():
clear_messages(request)
messages.error(request, "You need to create an account, username doesn't exist!")
serialized_messages = json.dumps([{
'message': message.message,
'message_tag': message.tags,
} for message in messages.get_messages(request)])
response_data = {
'show_form2': False,
'messages': serialized_messages}
else:
user = userQuery.first()
codeSender(request,user)
messages.success(request, "we've sent to your email a confirmation code please write it")
serialized_messages = json.dumps([{
'message': message.message,
'message_tag': message.tags,
} for message in messages.get_messages(request)])
response_data = {
'show_form2': True,
'messages': serialized_messages}
return JsonResponse(response_data)
return render(request, "authentication/resetPassword.html")
Проблема кроется здесь, в этом представлении я сравниваю код, введенный пользователем, чтобы увидеть, если он соответствует reset_code (переменная сессии), если он не соответствует, я попытался имитировать поведение формы1, так что я могу снова визуализировать форму подтверждения кода но дело в том, что он всегда сравнивает введенный код с первым кодом, сгенерированным codeSender в сессии, он не обновляет его, пока я не обновлю url сброса снова
def verify_code(request):
user_pk=request.session.get('user')
user=User.objects.filter(pk=user_pk).first()
if request.method == "POST" :
codetrial = request.POST.get("code")
if int(codetrial) == request.session.get('reset_code'):
return redirect("resetConfirm")
else:
clear_messages(request)
messages.error(request,'code doesnt match!, we sent you another code try again')
data = {'username':user.username, 'form_name': "form1"}
session = requests.Session()
resp = session.get('http://127.0.0.1:8000/reset')
csrf_token = resp.cookies['csrftoken']
resp2 = session.post('http://127.0.0.1:8000/reset', data=data, headers={'X-CSRFToken': csrf_token})
return render(request, 'authentication/resetPassword.html', {'json_data': resp2.text ,'identifier': 'view1'})
else:
return render(request,"authentication/resetPasswordConfirm.html",{"user":user.username})
вот ссылки
path('reset',views.resetPassword,name='reset'),
path('verify',views.verify_code,name='verify'),
и вот шаблон, есть 2 формы форма1, которая принимает имя пользователя, если оно существует, то вид resetCode показывает форму2, которая (форма подтверждения кода) отвечает за обработку кода, отправленного на электронную почту