Request.method == POST, равный true в следующей функции, что приводит к ее преждевременному запуску

итак, я запускаю этот код

def login_or_join(request):

    if request.method == "POST":
        option = request.POST.get("option")
        print('post request recieved')

        if option == "1":
            return login_screen(request)

        if option == '2':
            return in_game(request)

    return render(request,"login_or_join.html")

и функция def login_screen() выглядит следующим образом

def login_screen(request):
    if request.method == "POST":
    
        username = request.POST.get("username")
        password = request.POST.get("password")
        print(username)
        print(password)

        user = authenticate(request, username=username, password=password)
    
        print(user)

        if user is not None:
            return redirect('join_lobby')
        else:
            return render(request,'login_page.html',)
    
    return render(request, 'login_page.html')

Всякий раз, когда я нажимаю "вариант 1", запускается login_screen, но я этого не хочу. похоже, что он просто выполняет этот запрос.метод == "POST" и немедленно печатает имя пользователя и пароль, что означает, что он немедленно устанавливает имя пользователя и пароль, что делает любую попытку входа в систему неправильной. Но я не хочу, чтобы он устанавливал их (или печатал), пока я не нажму кнопку на следующей странице. Кроме того, когда я нажимаю "enter" или "log in", страница не отображается повторно с сообщением об ошибке, она просто возвращается к login_or_join(). У меня такое чувство, что я принимаю сумасшедшие таблетки, так как я работаю на этом веб-сайте уже некоторое время, и это первый раз, когда я сталкиваюсь с такой проблемой. Я пытался разобраться с этим, но чувствую, что слишком долго смотрю на это. Буду признателен за любую помощь!

Я предполагаю, что проблема в том, что вы вызываете login_screen с request в качестве параметра. Но эта переменная является параметром, полученным при login_or_join, так же как и запрос POST с параметром, ни GET, ни POST с именем пользователя и паролем.

Я думаю, что в этом случае вы можете просто указать URL-адрес и сделать:

if option == "1":
    return redirect(login_screen_name)
if option == "2":
    return redirect(in_game_screen_name)

Вы не хотите, чтобы экран входа в систему обрабатывал запрос, но создайте новый запрос GET на login_screen, таким образом:

def login_or_join(request):
    if request.method == 'POST':
        option = request.POST.get('option')
        if option == '1':
            return redirect('name-of-login-screen')
        if option == '2':
            return redirect('name-of-in-game-view')
    return render(request, 'login_or_join.html')

где вы передаете имена представлений, определенных в urls.py:

urlpatterns = [
    path('some/path/', login_screen, name='name-of-login-screen'),
    path('some/other/path/', in_game, name='name-of-in-game-view'),
]

Это так называемый Post/Redirect/Get архитектурный шаблон [wiki]. Это также необходимо для предотвращения непредвиденного поведения при обновлении в браузере. Если запрос, по которому был получен ответ, был POST-запросом, нажатие кнопки обновить в браузере приведет к созданию нового POST-запроса, что означает, что если запрос, например, добавит товар в корзину покупок, то теперь вы добавили это дважды.

Вернуться на верх