Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

HTTP retornando 405 Method Not Allowed

Criei o clássico jogo de adivinhação com Python bem básico só para ter a aplicação mesmo, o objetivo de estudo aqui era colocar pra rodar com Flask, semelhante ao projeto do curso 1 de Flask.

O programa em Python estava funcionando perfeitamente, os problemas surgiram somente na implementação do Flask para visualizar tudo nas páginas. Já revisei o código inúmeras vezes, fiz várias alterações e ainda não consegui encontrar o problema. O retorno é sempre "405 Method Not Allowed", mesmo que o method POST esteja colocado em todos os pontos que o curso ensina. Segue os códigos.

OBS: O bloco comentado é pq preferi deixar assim para que não interferisse nos testes da função index. Assim que conseguir rodar ela, vou passar para a função palpite.

ADVINHACAO.PY

from flask import Flask, render_template, request, redirect, session, flash, url_for
import random

class Usuario:
    def __init__(self, nickname, senha):
        self.nickname = nickname
        self.senha = senha

usuario1 = Usuario("luizrodgs", "alohomora")
usuarios = { usuario1.nickname : usuario1
             }

app = Flask(__name__)
app.secret_key = 'admin'

@app.route('/', methods=['POST',])
def index():
    intervalo1 = int(request.form['intervalo1'])
    intervalo2 = int(request.form['intervalo2'])
    if intervalo1 < intervalo2:
        troca = int(intervalo1)
        intervalo1 = int(intervalo2)
        intervalo2 = int(troca)
    numero_secreto = random.randrange(intervalo2, intervalo1+1)

    nivel = int(request.form['nivel'])
    if nivel == 1:
        vidas = 10
    elif nivel == 2:
        vidas = 7
    elif nivel == 3:
        vidas = 5
    return render_template('index.html', titulo='Jogar')

# @app.route('/palpite', methods=['POST',])
# def palpite():
#     palpite = None
#
#     contador_de_palpites = 1
#
#     while (palpite != numero_secreto) and (vidas > 0) and (palpite != numero_secreto) and controle_partida == 1:
#         print(f'Palpites restantes: {vidas}')
#         palpite = int(input(f'Informe seu {contador_de_palpites}° palpite: '))
#         contador_de_palpites += 1
#         if palpite == numero_secreto:
#             print("VOCÊ GANHOU!")
#             controle_partida = 0
#         else:
#             vidas -= 1
#             if (nivel == 1) or (nivel == 2):
#                 if (palpite < numero_secreto):
#                     print("Palpite incorreto! Tente um número MAIOR...")
#                 else:
#                     print("Palpite incorreto! Tente um número MENOR...")
#
#             if (vidas == 0):
#                 print("VOCÊ PERDEU!")
#                 controle_partida = 0
#                 print(f'O número secreto era: {numero_secreto}')
#                 break

app.run(debug=True)

TEMPLATE.HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Jogo da Adivinhação</title>
    <link rel="stylesheet" href="{{ url_for('static'), filename='bootstrap.css') }}">
</head>
<body>
    <div class="container">
      <div class="page-header">
          <h1>{{ titulo }}</h1>
      </div>

        {% block conteudo %} {% endblock %}

      </div>
  </body>
</html>

INDEX.HTML

{% extends "template.html" %}
{% block conteudo %}
    <form action="{{ url_for('/index') }}" method="post">
        <fieldset>
            <div class="form-group">
                <label for="intervalo1">Informe o primeiro número do intervalo: </label>
                <input type="text" id="intervalo1" name="intervalo1" class="form-control">
            </div>
            <div class="form-group">
                <label for="intervalo2">Informe o segundo número do intervalo: </label>
                <input type="text" id="intervalo2" name="intervalo2" class="form-control">
            </div>
            <div class="form-group">
                <label for="nivel">Informe o nível desejado (1 Fácil / 2 Medio / 3 Difícil): </label>
                <input type="text" id="nivel" name="nivel" class="form-control">
            </div>
                <button type="submit" class="btn btn-primary btn-enviar">Enviar</button>
        </fieldset>
    </form>
{% endblock %}

OBS: Bootstrap está na página static do projeto, conforme padrão.

3 respostas
solução!

Olá Luis, tudo bem?

Quando você digita no navegar www.site.com.br, o método padrão é o "GET". Se você quer manter a mesma rota para os dois métodos, eu faria assim:

@app.route('/', methods=['POST', 'GET'])
def index():
    if request.method == 'POST':
        intervalo1 = int(request.form['intervalo1'])
        intervalo2 = int(request.form['intervalo2'])
        if intervalo1 < intervalo2:
            troca = int(intervalo1)
            intervalo1 = int(intervalo2)
            intervalo2 = int(troca)
        numero_secreto = random.randrange(intervalo2, intervalo1+1)

        nivel = int(request.form['nivel'])
        if nivel == 1:
            vidas = 10
        elif nivel == 2:
            vidas = 7
        elif nivel == 3:
            vidas = 5
    return render_template('index.html', titulo='Jogar')

Boa noite Anderson, agradeço pela ajuda. Já tinha conseguido resolver, mas de qualquer forma não havia feito 100% igual você recomendou, então já serviu de aprendizado.

Para quaisquer fins, segue o link do projeto finalizado no Github: https://github.com/luizrodgs/ToDoList

Opa Luiz, que bom que valeu como contribuição.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software