então estou executando este código
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")
e def login_screen() se parece com isso
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')
Sempre que clico em "opção 1", ele executa login_screen, mas de uma forma que eu não quero. Parece que ele apenas segue essa solicitação.method == "POST" e imprime nome de usuário e senha imediatamente, o que significa que ele está definindo nome de usuário e senha imediatamente, tornando qualquer tentativa de login errada. Mas eu não quero que ele os defina (ou os imprima) até que eu tenha pressionado o botão na próxima página. Além disso, quando clico em "enter" ou "log in", ele não mostra novamente a página com a mensagem de erro, ele apenas retorna login_or_join(). Sinto que estou tomando pílulas malucas, pois estou trabalhando neste site há um tempo e esta é a primeira vez que estou tendo esse tipo de problema. Tentei mexer com ele, mas sinto que estou olhando para ele há muito tempo. Qualquer ajuda seria apreciada!
Acho que o problema é que você está chamando
login_screen
comrequest
um parâmetro. Mas essa variável é o parâmetro recebido emlogin_or_join
então é a requisição POST com a opção, nem um GET nem um POST com o nome de usuário e senha.Acho que neste caso você pode simplesmente nomear a URL e fazer:
Você não quer deixar a tela de login processar a solicitação, mas sim fazer uma nova solicitação GET para o
login_screen
, então:onde você passa os nomes das visualizações definidas em
urls.py
:Este é o chamado padrão arquitetônico Post/Redirect/Get [wiki] . Isso também é necessário para evitar comportamento inesperado quando você atualiza no navegador. Se a solicitação que gerou a resposta foi uma solicitação POST, clicar em atualizar no navegador fará uma nova solicitação POST, o que significa que se a solicitação, por exemplo, adicionaria um item a uma cesta de compras, agora você o adicionou duas vezes.