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-запроса, что означает, что если запрос, например, добавит товар в корзину покупок, то теперь вы добавили это дважды.