Django项目的密码重置循环出现异常错误

uqdfh47h  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(181)

我已经创建了一个登录系统,可以重置密码。
当我点击“忘记密码?”时,请求工作完美。“我收到了重置链接,但当我点击电子邮件中的链接时,我收到了错误消息。“异常类型:TypeError at /accounts/reset_password_validate/MzM/brm 129 - 52 c795 f84 dc 89 b21234642 b2166 f5 c4 f/异常值:reset_password()得到意外的关键字参数'uidb 64'“x1c 0d1x
我一直认为URL路径不是路由,但我已经更改了两次,我得到了相同的错误消息。URL.py

  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4. # Other URL patterns...
  5. path('registerUser/', views.registerUser, name='registerUser'),
  6. path('registerBusiness/', views.registerBusiness, name='registerBusiness'),
  7. # Update the URL pattern to use the login view
  8. #path('accounts/login/', views.login, name='login'),
  9. path('login/', views.user_login, name='login'),
  10. path('logout/', views.logout, name='logout'),
  11. path('myAccount/', views.myAccount, name='myAccount'),
  12. path('custDash/', views.custDash, name='custDash'),
  13. path('bussDash/', views.bussDash, name='bussDash'),
  14. path ('activate/<uidb64>/<token>/', views.activate, name='activate'),
  15. path('forgot_password/', views.forgot_password, name='forgot_password'),
  16. path('reset_password/', views.reset_password, name='reset_password'),
  17. path('reset_password_validate/<str:uidb64>/<str:token>/', views.reset_password, name='reset_password_validate'),
  18. ]

字符串
views.py

  1. from django.shortcuts import render , redirect
  2. from django.contrib.auth.hashers import make_password
  3. from business.forms import BussForm
  4. from .forms import UserForm
  5. from .models import User, userProfile
  6. from django.contrib import messages, auth
  7. from django.contrib.auth import authenticate, get_user_model, login as auth_login
  8. from .utils import detectUser, send_verification_email
  9. from django.contrib.auth.decorators import login_required, user_passes_test
  10. from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
  11. from django.contrib.auth.tokens import default_token_generator
  12. from django.core.exceptions import PermissionDenied
  13. # Create your views here.
  14. #restrict user access to wrong dashbaords
  15. def check_role_buss(user):
  16. if user.role == 1:
  17. return True
  18. else:
  19. raise PermissionDenied
  20. def check_role_customer(user):
  21. if user.role == 2:
  22. return True
  23. else:
  24. raise PermissionDenied
  25. # create user with form from website
  26. def registerUser(request):
  27. context = {}
  28. if request.user.is_authenticated:
  29. messages.warning(request, 'You have already logged into your account')
  30. return redirect('dashboard')
  31. elif request.method == 'POST':
  32. form = UserForm(request.POST)
  33. if form.is_valid():
  34. # password = form.cleaned_data['password']
  35. # user = form.save(commit=False) # Create a User instance without saving to the database
  36. # user.set_password(password)
  37. # user.role = User.CUSTOMER # Assign the role to the user
  38. # user.save() # Save the user to the database
  39. #create user from create usert method
  40. first_name = form.cleaned_data['first_name']
  41. last_name = form.cleaned_data['last_name']
  42. username = form.cleaned_data['username']
  43. email = form.cleaned_data['email']
  44. #phone_Number = form.cleaned_data['phone_Number']
  45. password = form.cleaned_data['password']
  46. user = User.objects.create_user(first_name = first_name, last_name = last_name, username = username, email = email, password = password)
  47. user.role = User.CUSTOMER # Assign the role to the user
  48. user.save()
  49. #send email verifcation
  50. send_verification_email(request, user)
  51. messages.success(request, 'Your accounts has been registered!')
  52. return redirect('registerUser')
  53. else:
  54. print('invalid entry')
  55. print(form.errors)
  56. else:
  57. form = UserForm()
  58. context['form'] = form
  59. return render(request, 'accounts/registerUser.html', context)
  60. def registerBusiness(request):
  61. if request.user.is_authenticated:
  62. messages.warning(request, 'You have already logged into your account')
  63. return redirect('dashboard')
  64. elif request.method =='POST':
  65. #store data and creare the business
  66. form = UserForm(request.POST)
  67. b_form = BussForm(request.POST)
  68. if form.is_valid() and b_form.is_valid:
  69. first_name = form.cleaned_data['first_name']
  70. last_name = form.cleaned_data['last_name']
  71. username = form.cleaned_data['username']
  72. email = form.cleaned_data['email']
  73. password = form.cleaned_data['password']
  74. user = User.objects.create_user(first_name = first_name, last_name = last_name, username = username, email = email, password = password)
  75. user.role = User.BUSINESS
  76. user.save()
  77. business = b_form.save(commit=False)
  78. business.user = user
  79. user_profile = userProfile.objects.get(user=user)
  80. business.user_profile = user_profile
  81. business.save()
  82. #send verifcation email business
  83. mail_subject = 'Please activate your account'
  84. email_template = 'accounts\emails\account_verif_email.html'
  85. send_verification_email(request,user, mail_subject, email_template)
  86. messages.success(request, 'Your business has been saved sucesfully and is now under approval')
  87. return redirect('registerBusiness')
  88. else:
  89. print('invalid form')
  90. print(form.errors)
  91. else:
  92. form = UserForm()
  93. b_form = BussForm()
  94. context = {
  95. 'form': form,
  96. 'b_form': b_form,
  97. }
  98. return render (request, 'accounts/registerBusiness.html', context)
  99. def activate(request, uidb64, token ):
  100. #activate user email from token vertifcation(setting =True)
  101. try:
  102. uid = urlsafe_base64_decode(uidb64).decode()
  103. user = User._default_manager.get(pk=uid)
  104. except(TypeError, ValueError, OverflowError, User.DoesNotExist):
  105. user = None
  106. if user is not None and default_token_generator.check_token(user, token):
  107. user.is_active = True
  108. user.save()
  109. messages.success(request, 'Your account has been sucessfully verifed and is now active! Thank you for your interest')
  110. return redirect ('myAccount')
  111. else:
  112. messages .error(request, 'invalid link, please try again')
  113. return redirect ('myAccount')
  114. # manage form details for login, logour and loop incase of error or mistype of passowrd
  115. #manages the pages based on the user roles and permissions for logging in
  116. def user_login(request):
  117. if request.user.is_authenticated:
  118. messages.warning(request, 'You have already logged into your account')
  119. return redirect('dashboard')
  120. elif request.method == 'POST':
  121. email = request.POST['email']
  122. password = request.POST['password']
  123. user = authenticate(request, email=email, password=password)
  124. if user is not None:
  125. auth_login(request, user) # Rename the function call to auth_login
  126. messages.success(request, 'You have successfully logged in.')
  127. return redirect('myAccount')
  128. else:
  129. messages.error(request, 'Invalid login details. Please check and try again.')
  130. return redirect('login')
  131. return render(request, 'accounts/login.html')
  132. # manage user accounts, reset password, login and register
  133. def logout(request):
  134. auth.logout(request)
  135. messages.info(request, 'You have logged out succesfully')
  136. return redirect('login')
  137. @login_required(login_url='login')
  138. def myAccount(request):
  139. user = request.user
  140. redirectUrl = detectUser(user)
  141. return redirect(redirectUrl)
  142. @login_required(login_url='login')
  143. @user_passes_test(check_role_buss)
  144. def bussDash(request):
  145. return render(request, 'accounts/bussDash.html')
  146. @login_required(login_url='login')
  147. @user_passes_test(check_role_customer)
  148. def custDash(request):
  149. return render(request, 'accounts/custDash.html')
  150. def forgot_password(request):
  151. if request.method == 'POST':
  152. email = request.POST['email']
  153. if User.objects.filter(email=email).exists():
  154. user = User.objects.get(email__exact=email)
  155. #send reset password email, used verfication email function instead to make it more efficient
  156. mail_subject = 'Reset Password Link'
  157. email_template = 'accounts/emails/reset_password_email.html'
  158. send_verification_email(request, user, mail_subject, email_template)
  159. messages.success(request, 'You password reset link has been sent to the added email address')
  160. return redirect('login')
  161. else:
  162. messages.error(request, 'Account does not exist. Please recheck your email address')
  163. return redirect('forgot_password')
  164. return render(request, 'accounts/forgot_password.html')
  165. def reset_password_validate(request, uidb64, token):
  166. User = get_user_model()
  167. try:
  168. uid = urlsafe_base64_decode(uidb64).decode()
  169. user = User.objects.get(pk=uid)
  170. except (TypeError, ValueError, OverflowError, User.DoesNotExist):
  171. user = None
  172. if user is not None and default_token_generator.check_token(user, token):
  173. request.session['uid'] = uid
  174. messages.info(request, 'Please reset your password')
  175. return redirect('reset_password')
  176. else:
  177. messages.error(request, 'Invalid reset password link.')
  178. return redirect('myAccount')
  179. def reset_password(request, uidb64, token):
  180. User = get_user_model()
  181. try:
  182. uid = urlsafe_base64_decode(uidb64).decode()
  183. user = User.objects.get(pk=uid)
  184. except (TypeError, ValueError, OverflowError, User.DoesNotExist):
  185. user = None
  186. if user is not None and default_token_generator.check_token(user, token):
  187. if request.method == 'POST':
  188. password = request.POST['password']
  189. user.set_password(password)
  190. user.save()
  191. messages.success(request, 'Your password has been reset successfully. Please log in with your new password.')
  192. return redirect('login')
  193. else:
  194. context = {
  195. 'uidb64': uidb64,
  196. 'token': token,
  197. }
  198. return render(request, 'accounts/reset_password.html', context)
  199. else:
  200. messages.error(request, 'Invalid reset password link.')
  201. return redirect('myAccount')
  202. def reset_password(request):
  203. return render(request, 'accounts/emails/reset_password_email.html')


account_verf_email.html

  1. {% autoescape off%}
  2. <!-- security feature to prevent cross scripting -->
  3. Hi {{user.first_name}},
  4. Please verify your email address by clicking on the below link.
  5. http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
  6. {% endautoescape %}


我已经检查了路由和uid被称为我不知道为什么它不重置passowrd链接或重定向到reset_password URL。我从这里改编了答案:Django : No Reverse Match on password reset和这里:NoReverseMatch on password_Reset_confirm
我真的很感谢你的帮助,谢谢这么多!

pod7payv

pod7payv1#

在views.py中有两个名为reset_password的视图
您的reset_password_activate视图调用了以下视图:

  1. return redirect('reset_password')

字符串
您的URLs.py将其解码为此路由(注意它被称为views.reset_password)

  1. path('reset_password/', views.reset_password, name='reset_password'),


views.py中的第一个reset_password视图就是这个视图

  1. def reset_password(request, uidb64, token):


(you可能是指底部的这一个)

  1. def reset_password(request):


但是你的路径没有描述任何参数,所以根据错误,uidb 64是意外的。
最简单的修复方法是简单地重命名两个视图中的一个,并确保每个视图都指向/被指向正确。

展开查看全部

相关问题