Django Аутентификация - страница, перенаправляющая на дом, даже если она входит в исключение - PullRequest
0 голосов
/ 13 апреля 2020

Я занимаюсь простой регистрацией пользователей в моем проекте, используя таблицу 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.py и другое views

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

views.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)

Пожалуйста, дайте мне знать, если что-то нужно раскрыть из кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...