Совсем недавно стал изучать фреймворк Flask и вот решил сделать небольшое, тестовое приложение, в стиле блога с постами. Вот только появилась такая проблема: при заполнении всех полей (title, intro, text & date) и нажатия кнопки Save, ничего не происходит. Хотя я прописал чтоб при удачном добавлении всех данных в БД, всплывало сообщение об это и происходил редирект на страницу с постами. Подскажите, что я делаю не так, возможно я что-то не так понимаю
Код:
Инициализация всего и вся:
from flask import Flask, render_template, url_for, redirect, flash from flask_sqlalchemy import SQLAlchemy from forms import NewsCreator from datetime import datetime app = Flask(__name__) app.config['SECRET_KEY'] = "kbfihlfnfar3r23rff32r2r2" app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db' db = SQLAlchemy(app) ....... if __name__ == '__main__': app.run(debug=True)
Для создания полей, использую Flask-WTF. Весь код в отдельном файле forms.py
from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, PasswordField, SelectField, TextAreaField, DateTimeField from wtforms.validators import DataRequired, Email, Length class NewsCreator(FlaskForm): title = StringField("Title", validators=[DataRequired(), Length(min=1, max=40)]) intro = TextAreaField("Synopsys", validators=[DataRequired(), Length(min=1, max=150)]) text = TextAreaField("Post", validators=[DataRequired(), Length(min=1, max=500)]) date = DateTimeField("Date", validators=[DataRequired()]) save_post = SubmitField("Save")
Класс таблицы БД находится в main.py (изначально был отдельно в models.py)
class Article(db.Model): __tablename__ = 'article' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(40), nullable=False) intro = db.Column(db.String(150), nullable=False) text = db.Column(db.Text, nullable=False) date = db.Column(db.DateTime, default=datetime.utcnow) def __repr__(self): return f'{self.title} {self.intro} {self.date}'
Так выглядит Route:
@app.route('/create_article', methods=['GET', 'POST']) def create_article(): form = NewsCreator() if form.validate_on_submit(): flash("Post created with success") return redirect(url_for('news')) return render_template('create_article.html', form=form)
Сюда должен происходить редирект:
@app.route('/news') def news(): return render_template('news.html')
В basic.html есть такой код для вывода сообщения об успешном добавлении поста:
{% block content %} {% with messages = get_flashed_messages() %} {% if messages %} {% for message in messages %} <div> {{ message }} </div> {% endfor %} {% endif %} {% endwith %} {% endblock %}
Ну и сам create_article.html:
{% extends 'basic.html' %} {% block title %} Create Article Form {% endblock %} {% block content %} <div> <h1>Add article</h1> <form action="http://127.0.0.1:5000/create_article" method="POST"> {{ form.hidden_tag() }} {{ form.title.label }} {{ form.title() }} {{ form.intro.label }} {{ form.intro() }} {{ form.text.label }} {{ form.text() }} {{ form.date.label }} {{ form.date() }} {{ form.save_post() }} </form> </div> {% endblock %}
Возможно это важно, после того как создал класс таблицы, в терминале запустил команду
>>> from main import db
>>>db.create_all()
В тот момент, класс таблицы находился в файле models.py, потом я подумал что это может быть причиной и перевёл класс в main.py а сам model.py удалил.