Submit do form no Flask retornando 405 Method not Allowed

Estou com problema na hora de atualizar o cliente,quando eu clico no botão de salvar me traz um erro 405, me parece que ele critica o método PUT (estou usando o cru.js)

codigo da pagina form_cliente.html:

<form class="c-form" 
    {% if clinete %}
      action="{{ url_for('cliente.atualizar_cliente',cliente_id=cliente.id) }}" 
    {% else %}
      action="{{ url_for('cliente.inserir_cliente') }}"
    {% endif %}

    method="{% if cliente %}PUT{% else %}POST{% endif %}"

    c-append="#lista-clientes"> 

    <div class="mb-3">
      <label class="form-label">Nome</label>
      <input type="text" class="form-control" name="nome" {% if cliente %}value="{{cliente.nome}}"{% endif %}>
    </div>

    <div class="mb-3">
        <label class="form-label">E-mail</label>
        <input type="email" class="form-control" name="email" {% if cliente %}value="{{cliente.email}}"{% endif %}>
      </div>

    
    <button type="submit" class="btn btn-primary">
      {% if cliente %}Salvar{% else %}Criar{% endif %}
    </button>
</form>

codigo cliente.py:

from flask import Blueprint, render_template, request
from database.cliente import CLIENTES

cliente_route = Blueprint('cliente',__name__)

#Listar os clientes
@cliente_route.route('/')
def lista_clientes():
    return render_template('lista_clientes.html',clientes=CLIENTES)

#Inserir os dados do cliente
@cliente_route.route('/',methods=['POST'])
def inserir_cliente():
    data = request.json
    novo_usuario = {
        "id": len(CLIENTES) + 1,
        "nome": data['nome'],
        "email": data['email']
    }

    CLIENTES.append(novo_usuario)
    return render_template('item_cliente.html',cliente=novo_usuario)

#Formulario para cadastrar um cliente
@cliente_route.route('/new')
def form_cliente():
    return render_template('form_cliente.html')

#Exibir detalhes do cliente
@cliente_route.route('/<int:cliente_id>')
def detalhe_cliente(cliente_id):
    return render_template('detalhe_cliente.html')


#Formulario para editar um cliente
@cliente_route.route('/<int:cliente_id>/edit')
def form_edit_cliente(cliente_id):
    cliente = None
    for c in CLIENTES:
        if c['id'] == cliente_id:
            cliente = c
    return render_template('form_cliente.html',cliente=cliente)

#Formulario para atualizar  um cliente
@cliente_route.route('/<int:cliente_id>/update',methods=['PUT'])
def atualizar_cliente(cliente_id):
    cliente_editado = None
    data = request.json
    for c in CLIENTES:
        if c['id'] == cliente_id:
            c['nome'] = data['nome']
            c['email'] = data['email']

            cliente_editado = c
    
    return render_template('item_cliente.html',cliente= cliente_editado)


#Formulario para deletar  um cliente
@cliente_route.route('/<int:cliente_id>/delete',methods=['DELETE'])
def deletar_cliente(cliente_id):
    global CLIENTES
    CLIENTES = [ c for c in CLIENTES if c['id'] != cliente_id]
    return {'deleted': 'ok'}
1 curtida

O problema está na hora de construir sua URL, você digitou cliente errado.

Veja no seu arquivo form_cliente.html o primeiro IF:

<form class="c-form" 
    {% if clinete %}
...

O correto seria {% if cliente %}.

Ou seja, por conta desse erro ele sempre está caindo no else, e a rota inserir_cliente aceita apenas o método POST, por isso ele está reclamando do método PUT.

Espero ter ajudado, abraços!

1 curtida