2017-01-25 1 views
0

У меня есть простое веб-приложение, построенное с использованием Python с фляжкой с тремя страницами: main, index и post. Я пытаюсь добраться до раздела «if request.method ==« POST »на индексной странице. Чтобы проверить это, я попросил его отобразить страницу post.html. По какой-то причине, когда я отправляю метод POST с индексной страницы, я вместо этого перенаправляется на мою главную страницу. Код питона выглядит следующим образом:Почему html POST выводит меня на неожиданную страницу?

from flask import Flask, redirect, render_template, request, url_for 

app = Flask(__name__) 
app.config["DEBUG"] = True 


@app.route("/", methods=["GET", "POST"]) 
def index(): 
    if request.method == "GET": 
     return render_template("main_page.html") 
    #implied ELSE here (if it's not GET, do the following for a POST) 
    return redirect(url_for('index')) 

@app.route('/index', methods=['GET', 'POST']) 
def new_index(): 
    if request.method == "POST": 

     #I AM TRYING TO GET HERE 

     return render_template('post.html') 
    if request.method == "GET": 
     return render_template('index.html',) 

@app.route('/post') 
def post(): 
    return render_template('post.html') 

метод POST из index.html приходит от этого:

<div class="row"> 
    <form role="form" method='POST' action='.'> 
     <textarea class="form-control" name="contents" placeholder="Enter a comment"></textarea> 
     <button type="submit" class="btn btn-default">Submit</button> 
    </form> 
</div> 

Я не особо знаком с HTML, но я попробовал все, что я могу думать , Любой совет?

ответ

1

Если вы хотите установить ссылку на ту же страницу в действии формы, вы должны на самом деле поставить вопросительный знак, пустую строку, хеш или просто оставить атрибут вместе. Выполнение любого из этих действий позволит исправить ваш код.

<form role="form" method='POST' action='?'> 
<form role="form" method='POST' action='#'> 
<form role="form" method='POST' action=''> 
<form role="form" method='POST'> 

Мое личное предпочтение используется.

<form role="form" method='POST' action='#'> 

Это будет подтверждено в XHTML и не откроет никаких известных векторов атак.

1

Первое, что я сделал, это тестирование вашего API с помощью Postman, и все работает нормально: GET переходит к обработчику GET, POST отправляется на обработчик POST.

Ошибка, которую я нашел, находится в html-форме, в частности тег : вы должны указать это на обработчик API явно и относительно имени хоста. Так, например, установив, что:

<form role="form" method='POST' action='/index'> 

будет на самом деле выполнить POST на /индекс API вашего Колба приложения.

+0

Это, в общем, не очень удобный способ сделать это. Вы должны просто сделать действие текущей страницей, так что, если вы измените имя своей веб-страницы, это не повлияет на ваш код. –

+0

@Jamie C Я не согласен с этим. Я думаю, что наличие явной конечной точки URI/API в форме делает ее более читаемой и более простой в обслуживании в долгосрочной перспективе. «?» опция является ярлыком, но также изменяет URI, на который вы отправлены. Теперь ваш «GET» происходит от «/ index», а POST отправляет вас в «/ index?», Что не совсем то же самое. – sal

Смежные вопросы