简体   繁体   中英

Flask - 400 Bad request

I have this python code which should take in data from an html form and use it in a WHERE clause:

@app.route('/search', methods=['GET'])
def search():
    connect = cx_Oracle.connect("benjamin", "siliyetu", "PRINCE-PC/XE")
    cursor = connect.cursor()

    searched = request.form['search']
    named_params = {'search':searched}
    query = cursor.execute("SELECT * FROM edited WHERE REGEXP_LIKE (cod_ed, 
                            :search) OR REGEXP_LIKE (nome_ed,:search) OR 
                            REGEXP_LIKE (endereco,:search) OR REGEXP_LIKE 
                            (telefone,:search) OR REGEXP_LIKE 
                            (cidade,:search)", named_params)

    results = cursor.fetchall()
    posts = list(results)
    return render_template('search.html', posts=posts)

and the template I'm using is this(part of the template anyway. Its not the whole thing):

<form method="POST" action="/editora" class="form-outline" >
        <div class="col-lg-7 col-offset-6 right">
            <div class="form-group mx-lg-3 mb-2">
                <label for="element-7" ></label>
                <input id="search" name="search" type="text" class="form-control" placeholder="Pesquisar..." />
                <label></label>
                <a class="btn btn-primary " type="submit" href="search">Pesquisa</a>

When I try to use the data from the form, it gives me a

werkzeug.exceptions.HTTPException.wrap.<locals>.newcls: 400 Bad Request: KeyError: 'search'

But when I input data using input() it works fine. What gives!?

How would I go about fixing this issue? I also want to add some regular expressions in the where clause but its not budging. How do I do that too?

Ps- I'm working with oracle express edition 11g

Without having a traceback (you are running with the debug server while developing, right?), the exception you're getting comes from the

searched = request.form['search']

line.

  • the HTML example you have POSTs to /editora
  • the Python code you have has a route /search (not /editora ) and the view won't accept POST requests anyway ( methods=['GET'] ).

Are you sure the snippets you've posted are correct?

request.form is only populated for POST requests, anyway.

If you want to submit data to search route, you form action should point to that route.

<form method="POST" action="/search" class="form-outline" >

And if you want for a search route to get that data from POST request, you should put in methods 'POST' value.

@app.route('/search', methods=['GET', 'POST'])

The reason why you get:

werkzeug.exceptions.HTTPException.wrap.<locals>.newcls: 400 Bad Request: KeyError: 'search'
  1. because you are sending something to the application or server that they cannot handle. ( http://werkzeug.pocoo.org/docs/0.14/exceptions/#werkzeug.exceptions.BadRequest )
  2. KeyError is for trying to access dict object parameter 'search' which doesn't exist beucase form is never submited.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM