Новый для Python и использующий Flask, мой метод POST не рендерится в моей локальной среде, получая 302 Http-статуса - PullRequest
0 голосов
/ 25 февраля 2020

Я делаю учебник flask на Youtube , и я не могу заставить мое приложение показывать новые действия в списке, когда я публикую их в базе данных. Там нет ошибки, но я получаю 302 http ответа. Мой код аналогичен учебнику, поэтому я не могу понять, откуда исходит ошибка. Я считаю, что задача на самом деле не публикуется в базе данных должным образом, но я не уверен, что знаю достаточно о Python для подтверждения.

В app.py:

from flask import Flask, render_template, url_for, request, redirect
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(200), nullable=False)
    date_created = db.Column(db.DateTime, default=datetime.utcnow)

    def __repr__(self):
        return '<Task %r>' % self.id


@app.route('/', methods=['POST', 'GET'])
def index():
    if request.method == 'POST':
        task_content = request.form['content']
        new_task = Todo(content=task_content)

        try:
            db.session.add(new_task)
            db.session.commit()
            return redirect('/')
        except:
            return 'There was an issue adding your task'

    else:
        tasks = Todo.query.order_by(Todo.date_created).all()
        return render_template('index.html', task=tasks)


if __name__ == '__main__':
    app.run

В индексе. html:

{% extends 'base.html' %}

{% block head %}

{% endblock %}

{% block body %}
<div class="content">
<h1>Task Master</h1>

<table>
    <tr>
        <th>Task</th>
        <th>Added</th>
        <th>Actions</th>

    </tr>
    {% for task in tasks %}
    <tr>
        <td>{{ task.content }} </td>
        <td>{{ task.date_created.date }} </td>
        <td>
            <a href="">delete</a>
            <br>
            <a href="">update</a>
        </td>
    </tr>
    {% endfor %}
</table>

<form action="/" method="POST">
    <input type="text" name="content" id="content">
    <input type="submit" value="Add Task">
</form>
</div>
{% endblock %}

1 Ответ

0 голосов
/ 25 февраля 2020

Это ожидается с помощью строки «return redirect» ('/')".

. Кажется, совершенно бесполезно перенаправлять пользователя на страницу' / 'после POST, где браузер затем вызывает GET Запрос на эту же страницу.

Вы можете сделать следующее, чтобы пропустить перенаправление и, следовательно, HTTP 302.

@app.route('/', methods=['POST', 'GET'])
def index():
    if request.method == 'POST':
        task_content = request.form['content']
        new_task = Todo(content=task_content)

        try:
            db.session.add(new_task)
            db.session.commit()
        except:
            return 'There was an issue adding your task'

    tasks = Todo.query.order_by(Todo.date_created).all()
    return render_template('index.html', task=tasks)
...