- Importar a classe
Config
do arquivoconfig.py
, localizado na raiz do projeto
# app/__init__.py
from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from config import Config
app = Flask(__name__) # inicializar a aplicação
app.config.from_object(Config) # aplicar as configurações
db = SQLAlchemy(app) # inicializar o banco de dados
migrate = Migrate(app, db) # inicializar o framework de migrations
login = LoginManager(app) # inicializar o framework de autenticação
from . import routes, models
# config.py
import os
class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY')
- flask-wtf - formulários
- flask-sqlalchemy - banco de dados relacional
- flask-migrate - migrações de banco de dados
- flask-login - autenticação
- flask-dotenv - usar arquivo de variáveis de ambiente
.flaskenv
-
Todos as classes formulários vão herdar da classe
flask_wtf.FlaskForm
-
Os campos são do tipo da classe
wtforms.<Tipo>
-
Os validadores de campo vem do pacote
wtforms.validators
-
Validadores:
validators.DataRequired()
-
Tipos de campos
wtforms.StringField('label', validators=[lista_de_validadores])
wtforms.PasswordField('label', validators=[lista_de_validadores])
wtforms.BooleanField('label')
wtforms.SubmitField('label')
SQLACHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///' + os.path.join(BASEDIR, 'app.db')
SQLACHEMY_TRACK_MODIFICATIONS = False
-
Todas a classes modelos vão herdar da classe
db.Model
-
Os atributos são do tipo da classe
db.Column
, passando o tipo real pelo construtor dessa classe -
Tipo de dados:
db.String(<quantidade_de_caracteres>)
db.Integer
db.DateTime
db.ForeignKey('<relação.id>')
-
Relacionamento One to Many
Criar uma referencia da relação tanto na tabela One
quanto na Many
- Na tabela com referencia
One
, usar odb.relationship()
- Na tabela com referencia
Many
, usar odb.Column
com o segundo argumentodb.ForeignKey('id')
# app/models.py
from . import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(32), index=True, unique=True)
posts = db.relationship('Post', backref='author', lazy='dynamic')
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.String(140))
user_id = db.Column(db.Integer, db.ForeignKey('user_id'))
-
O comando
flask db init
cria o repositorio demigrations
-
O comando
flask db migrate -m "<mensagem>"
cria umamigration
-
O comando
flask db upgrade
aplica asmigrations
-
O comando
flask db downgrade
desfaz a últimamigration
- Adicionar as funcionalidades importantes para autenticação na tabela de usuarios
from flask_login import UserMixin
class User(UserMixin, db.Model):
# ...
- Criar função para pegar usuário logado
from . import login
@login.user_loader
def load_user(id):
return User.query.get(int(id))
- Pegar usuário logado
from flask_login import current_user
- Função de logar o usuário
from flask_login import login_user
- Função de deslogar o usuário
from flask_login import logout_user
- Decorator de login exigido
from flask import render_template
from flask_login import login_required
from . import app
@app.route('/')
@login_required
def home():
return render_template('inde.html')