Flask - получить данные с формой и перенаправить - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь следовать учебнику https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms с небольшими изменениями (я пытаюсь использовать его для своей домашней работы). Я просто пытаюсь изменить его, поэтому я получу данные формы, а затем обработаю их. Пока что я просто пытаюсь набрать sh данных, позже я хочу перенаправить на другую страницу и показать результаты там. Проблема в том, что все, что я пишу в форме, ничего не делает - меня просто перенаправляют на главную страницу, где находится форма. Это даже не очищается! Что я делаю неправильно? Пока что у меня есть:

Структура каталогов:

homework:
 -app:
  -templates:
   -base.html
   -index.html
  -__init__.py
  -forms.py
  -routes.py
 -config.py
 -main.py

config.py содержит только класс Config с некоторыми константами в качестве атрибутов, поэтому я не включил его, а main.py только импортирует приложение.

база. html:

<html>
    <head>
      <title>Weather consultant</title>
    </head>
    <body>
        <div>
            Weather consultant:
            <a href="{{ url_for('index') }}">Home</a>
        </div>
        <hr>
        {% with messages = get_flashed_messages() %}
        {% if messages %}
        <ul>
            {% for message in messages %}
            <li>{{ message }}</li>
            {% endfor %}
        </ul>
        {% endif %}
        {% endwith %}
        {% block content %}{% endblock %}
    </body>
</html>

index. html:

{% extends "base.html" %}

{% block content %}
    <h1>Enter query</h1>
    <form action="" method="post" novalidate>
        <p>
            {{ form.city.label }}<br>
            {{ form.city()}}
        </p>
        <p>
            {{ form.date.label }}<br>
            {{ form.date() }}
        </p>
        <p>{{ form.use_dark_sky() }}
            {{ form.use_dark_sky.label }}</p>

        <p>{{ form.use_storm_glass() }}
            {{ form.use_storm_glass.label }}</p>

        <p>{{ form.use_weather_stack() }}
            {{ form.use_weather_stack.label }}</p>

        <p>{{ form.use_yahoo() }}
            {{ form.use_yahoo.label }}</p>

        <p>{{ form.use_open_weather() }}
            {{ form.use_open_weather.label }}</p>

        <p>{{ form.use_weather_bit() }}
            {{ form.use_weather_bit.label }}</p>

        <p>{{ form.use_visual_crossing() }}
            {{ form.use_visual_crossing.label }}</p>

        <p>{{ form.submit() }}</p>
    </form>
{% endblock %}

__init__.py:

from flask import Flask
from config import Config

app = Flask(__name__)
app.config["SECRET_KEY"] = "not-so-secret"
config = Config()

from app import routes

forms.py:

class UserInputForm(FlaskForm):
    city = StringField("City")
    date = StringField("Enter desired date (format DD/MM/YYYY)")
    use_dark_sky = BooleanField("Use DarkSky API")
    use_storm_glass = BooleanField("Use Storm Glass API")
    use_weather_stack = BooleanField("Use WeatherStack API")
    use_yahoo = BooleanField("Use Yahoo Weather API")
    use_open_weather = BooleanField(
        "Use OpenWeather API - only current and near future data")
    use_weather_bit = BooleanField(
        "Use WeatherBit API - only current and future data")
    use_visual_crossing = BooleanField("Use VisualCrossing API")
    submit = SubmitField("Search")

rout.py:

@app.route("/", methods=["GET", "POST"])
def index():
    form = UserInputForm()
    if form.validate_on_submit():
        session["form"] = form
        flash('Data requested for city {}, date={}'.format(
            form.city.data, form.date.data))
        return redirect(url_for("index"))
    return render_template("index.html", form=form)

1 Ответ

1 голос
/ 08 марта 2020

Первоначальная проблема была с ключом CSRF, оказалось, что API недавно изменился (и тихо), см. https://flask-wtf.readthedocs.io/en/stable/csrf.html. Отредактированная часть __init__.py:

app = Flask(__name__)
app.config['SECRET_KEY'] = "not-so-secret"
csfr = CSRFProtect(app)
config = Config()

Спасибо @snakecharmerb за предоставление рекомендаций по отладке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...