66

I'm just starting to learn Flask, and I am trying to create a form which will allow a POST method.

Here's my method:

@app.route('/template', methods=['GET', 'POST'])
def template():
    if request.method == 'POST':
        return("Hello")
    return render_template('index.html')

And my index.html:

<html>

<head>
  <title> Title </title>
</head>

<body>
  Enter Python to execute:
  <form action="/" method="post">
    <input type="text" name="expression" />
    <input type="submit" value="Execute" />
  </form>
</body>

</html>

Loading the form (rendering it when it receives GET) works fine. When I click on the submit button however, I get a POST 405 error Method Not Allowed.

Why isn't it displaying "Hello"?

CryptoFool
  • 21,719
  • 5
  • 26
  • 44
darksky
  • 20,411
  • 61
  • 165
  • 254

3 Answers3

49

Your form is submitting to / when the method is routed for /template unless that is a typo, you should adjust your form's action attribute to point at the template view: action="{{ url_for('template') }}"

davidism
  • 121,510
  • 29
  • 395
  • 339
Burhan Khalid
  • 169,990
  • 18
  • 245
  • 284
16

Replace:

 <form action="/" method="post">

with:

 <form action="{{ url_for('template') }}" method="post">
davidism
  • 121,510
  • 29
  • 395
  • 339
thikonom
  • 4,219
  • 3
  • 26
  • 30
6

If you omit the action attribute, the form will post to the current URL.

Replace:

<form action="/" method="post">

with:

<form method="post">
davidism
  • 121,510
  • 29
  • 395
  • 339
Ankur_Jatt
  • 241
  • 2
  • 4