首页 > 解决方案 > Django Authentication - 页面重定向到主页,即使它进入异常

问题描述

我正在使用 Django 的User表做我项目的简单用户注册部分。下面的代码应该在用户注册成功后重定向到主页,但即使我填写了用户名的重复(不正确)条目,它也会转到主页而不是在注册页面上显示错误。

PS - 尽量保持问题简短,不显示不必要的代码请阅读代码和日志中的评论,在那里添加额外的解释

def register(request):
  if request.method == 'POST':
    reqdict = to_reqdict(request)
    print("reqdict", reqdict) # This statement printed in the logs
    username = reqdict.get('email')
    first_name = reqdict.get('first_name')
    last_name = reqdict.get('last_name')
    raw_password = reqdict.get('password')
    try:
        user = User.objects.create_user(username=username,first_name=first_name, 
                   last_name=last_name,email=username, password=raw_password) 
        user.save()
        user = authenticate(username=username, password=raw_password)
        login(request, user)
        print("user.is_authenticated>>>>>", user.is_authenticated) # This does not get printed in the logs
        return redirect(reverse('home')) # Only this line redirects page to home page
    except IntegrityError as e:
      messages.error(request, "User already exists!")
      print("error", e) #This error statement has got printed in the logs
    except Exception as e:
      messages.error(request, "Internal server error")
      print("Other error", e)
    return render(request, template_name="signup.html") 
  else:
    return render(request, template_name="signup.html")

有关详细信息,请参阅日志:

System check identified no issues (0 silenced).
April 13, 2020 - 15:51:54
Django version 3.0.5, using settings 'backend.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[13/Apr/2020 18:56:33] "GET / HTTP/1.1" 200 7616         # Typed http://127.0.0.1:8000/ in the browser
[13/Apr/2020 18:56:38] "GET /register/ HTTP/1.1" 200 7916 # Opened Sign Up page, Filled up and Clicked Sign up (Submit) button
reqdict {'first_name': 'John', 'last_name': 'Doe', 'email': 'john@gmail.com', 'password': 'a', 'cpassword': 'a'}  # It printed first print  statement
error UNIQUE constraint failed: auth_user.username   #It came to exception due to duplicate entry in the db but still got redirected to the homepage
[13/Apr/2020 18:56:57] "POST /register/ HTTP/1.1" 200 8181 
[13/Apr/2020 18:56:59] "GET /home/ HTTP/1.1" 302 0    # It redirected to Home page, What makes my code goes here instead of sign up page again
[13/Apr/2020 18:56:59] "GET /?next=/home/ HTTP/1.1" 200 7616

在我捕获到主页的异常后发生了什么,除了下面的行之外没有其他行重定向到主页?

return redirect(reverse('home'))

JFYI、urls.pyviews

urlpatterns = [
    path('', views.user_login, name='user_login'),
    path('home/', views.index, name='home'),
    path('register/', views.register, name='register'),
]

视图.py

@login_required(login_url='/')
def index(request):
  return render(request, template_name="home.html")

def user_login(request):
    username = request.POST.get('username', None)
    password = request.POST.get('password', None)
    if not any([username, password]):
        return render(request, template_name="login.html")
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        # return render(request, template_name="base.html")
        return JsonResponse({"message": "Redirect to home", "code":10001, "status":True}, status=200)
    else:
        return JsonResponse({"message": "Incorrect username or password. Please try again.", "code":10002, "status":False}, status=403)

请让我知道是否需要从代码中披露任何内容。

标签: pythondjangoauthentication

解决方案


推荐阅读