import flask from flask import Flask, request, current_app, url_for, render_template, flash, redirect from werkzeug.security import generate_password_hash, check_password_hash from flask_script import Manager, Shell from flask_migrate import Migrate, MigrateCommand from flask_login import LoginManager, UserMixin, login_required, login_user, current_user, logout_user from jinja2 import Template from flask_sqlalchemy import SQLAlchemy from datetime import datetime from forms import ContactForm, LoginForm app = Flask(__name__) app.debug = True app.config['SECRET_KEY'] = '0d6e368e-bd0c-11ea-921d-9342d47f60ca' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///db.sqlite" db = SQLAlchemy(app) login_manager = LoginManager(app) login_manager.login_view = 'login' migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand) class Category(db.Model): __tablename__ = 'categories' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(255), nullable=False) slug = db.Column(db.String(255), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) posts = db.relationship('Post', backref='category') def __repr__(self): return "<{}:{}>".format(id, self.name) class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer(), primary_key=True) title = db.Column(db.String(255), nullable=False) slug = db.Column(db.String(255), nullable=False) content = db.Column(db.Text(), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow) category_id = db.Column(db.Integer(), db.ForeignKey('categories.id')) def __repr__(self): return "<{}:{}>".format(self.id, self.title[:10]) post_tags = db.Table('post_tags', db.Column('post_id', db.Integer, db.ForeignKey('posts.id')), db.Column('tag_id', db.Integer, db.ForeignKey('tags.id')) ) class Tag(db.Model): __tablename__ = 'tags' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(255), nullable=False) slug = db.Column(db.String(255), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) posts = db.relationship('Post', secondary=post_tags, backref='tags') def __repr__(self): return "<{}:{}>".format(id, self.name) class Feedback(db.Model): __tablename__ = 'feedbacks' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(1000), nullable=False) email = db.Column(db.String(100), nullable=False) message = db.Column(db.Text(), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) def __repr__(self): return "<{}:{}>".format(self.id, self.name) class User(db.Model, UserMixin): __tablename__ = 'users' id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(100)) username = db.Column(db.String(50), nullable=False, unique=True) email = db.Column(db.String(100), nullable=False, unique=True) password_hash = db.Column(db.String(100), nullable=False) created_on = db.Column(db.DateTime(), default=datetime.utcnow) updated_on = db.Column(db.DateTime(), default=datetime.utcnow, onupdate=datetime.utcnow) def __repr__(self): return "<{}:{}>".format(self.id, self.username) def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) @login_manager.user_loader def load_user(user_id): return db.session.query(User).get(user_id) @app.route('/admin/') @login_required def admin(): return render_template('admin.html') @manager.command def faker(): print("Команда для добавления поддельных данных в таблицы") @app.route('/') def index(): return render_template('index.html') @app.route('/login/', methods=['post', 'get']) def login(): if current_user.is_authenticated: return redirect(url_for('admin')) form = LoginForm() if form.validate_on_submit(): user = db.session.query(User).filter(User.username == form.username.data).first() if user and user.check_password(form.password.data): login_user(user, remember=form.remember.data) nextpage = request.args.get('next', url_for('admin')) return redirect(nextpage) else: flash("Invalid username/password", 'error') return render_template('login.html', form=form) @app.route('/logout/') @login_required def logout(): logout_user() flash("You have been logged out.") return redirect(url_for('login')) @app.route('/contact/', methods=['get', 'post']) def contact(): form = ContactForm() if form.validate_on_submit(): name = form.name.data email = form.email.data message = form.message.data print(name) print(email) print(message) # здесь логика базы данных feedback = Feedback(name=name, email=email, message=message) db.session.add(feedback) db.session.commit() print("\nData received. Now redirecting ...") flash("Message Received", "success") return redirect(url_for('contact')) return render_template('contact.html', form=form) def shell_context(): import os, sys return {'app': app, 'os': os, 'sys': sys, 'flask': flask, 'request': request, 'current_app': current_app, 'url_for': url_for, 'Template': Template, 'db': db} manager.add_command("shell", Shell(make_context=shell_context)) if __name__ == "__main__": db.init_app(app) manager.run()