Para entender como uma aplicação web é feita em python estou tentando criar uma pagina em que o usuário possa se cadastrar, logar, adicionar comentários sobre suas nebulosas preferidas e então salva-las em seu perfil.
Entretanto na tentativa de adicionar informações em uma tabela (nome da tabela: ‘Nebula_docs’) no SQLAlchemy, parecer haver um conflito com uma outra tabela já criada (nome da tabela: ‘User’)
Obs: por dificuldades no processo minhas tabelas estão no mesmo arquivo .py que a função de run da app. O que definitivamente não é ideal.
Ao rodar o app recebo a seguinte mensagem:
sqlalchemy.exc.InvalidRequestError: Object ‘<Nebula_docs at 0x1a198d84fd0>’ is already attached to session ‘5’ (this is ‘6’)
Aqui esta meu arquivo init.py
import os
from flask import Flask
from sqlalchemy import Column, String, Integer
from sqlalchemy import Float, DateTime, Text, ForeignKey
from sqlalchemy.orm import relationship
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from datetime import datetime
db = SQLAlchemy()
# primeira tabela com os dados do usuário
class User(db.Model):
__tablename__='User'
id = Column(Integer, primary_key=True)
email = Column(String(100), unique=True)
password = Column(String(100))
name = Column(String(100))
catalog = relationship('Nebula_docs', backref='author', lazy=True)
#funçãos que geralmente compõe o UserMixin
@property
def is_active(self):
def get_id(self):
return True
def is_authenticated(self):
return True
def is_anonymous(self):
return False
#segunda tabela em que os dados da Nebulosa que o usuário completar
class Nebula_docs(db.Model):
__tablename__='Nebula_docs'
id = Column(Integer, primary_key=True)
day_register = Column(DateTime,nullable=False, default=datetime.utcnow)
nebula_name = Column(String(50), nullable=False)
ngc_code = Column(String(6))
comment = Column(Text)
user_id = Column(Integer, ForeignKey('User.id'), nullable=False)
#função de inicialização da app
def create_app():
app = Flask(__name__)
#configurando a pp
app.config.update(SECRET_KEY=os.urandom(24))
app.config('SQLALQUEMY_DATABASE_URI') = 'sqlite:///db.sqlite3'
#iniciando o banco de dados
db.init_app(app)
with app.app_context():
db.create_all()
#iniciando o login do usuario
login_manager = LoginManager()
login_manager.login_view= 'auth.login'
login_manager.init_app(app)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint)
return app
O arquivo que contém o registro dos dados na tabela ‘Nebulas_docs’ é o seguinte:
main.py
from flask import Blueprint, render_template, url_for, request, redirect, flash
from flask_login import login_required, current_user
from .__init__ import User
from .__init__ import Nebula_docs
from .__init__ import db
main = Blueprint('main', __name__) __name__ is the name o the project
@main.route('/')
def index():
return render_template('index.html')
@main.route('/profile')
@login_required
def profile():
return render_template('profile.html', name= current_user.name)
@main.route('/new')
@login_required
def new_nebula():
return render_template('add_nebula.html')
#aqui se adiciona os dados da nebulosa
@main.route('/new', methods= ('POST'))
@login_required
def new_nebula_post():
nebula_name = request.form.get('nebula_name')
ngc_code = request.form.get('ngc_code')
comment = request.form.get('comment')
nebula = Nebula_docs(nebula_name=nebula_name, ngc_code=ngc_code, comment=comment, author=current_user)
db.session.add(nebula) #creio que aquie steja o erro
db.session.commit()
flash('Your nebula has been added')
return redirect(url_for('main.index'))
#aqui se guardaria as informações definidas na função anterior
@main.route('/user_nebulas')
@login_required
def all_user_nebulas():
user = User.query.filter_by(email=current_user.email).first_or_404()
catalog = user.catalog
return render_template(url_for('all_nebulas.html'), catalog=catalog, user=user)
creio que esteja havendo uma sobreposição das tabelas User e Nebula_docs, que estão compartilhando o mesmo db, mas não sei como resolver isso de maneira alguma.
Se alguem puder me ajudar ficaria imensamente grato.