如何解决flask-login和flask-blueprint中发生的SQLAlchemy错误?

问题描述 投票:0回答:1

我是一名 Perl 程序员,正在将大型应用程序移植到 Python。我使用 Flask-blueprint 作为整体 app.py 将无法工作。我有 Flask-blueprint 运行良好,现在正在尝试使用在 app.py 上下文中工作的登录脚本,但当代码在 auth 子目录中的 paths.py 中使用时会生成解析错误:“RuntimeError:当前Flask 应用程序未在此“SQLAlchemy”实例中注册。您是否忘记调用“init_app”,或者您是否创建了多个“SQLAlchemy”实例?任何提示表示赞赏。

文档根目录中的app.py:

from Advance import create_app
from flask import render_template
app=create_app()

@app.route('/')
def index():
        return render_template('index.html')

if __name__=='__main__':
        app.run(debug=True)
主子目录中的

init.py(高级):

from flask import Flask, render_template

def create_app():
    app=Flask(__name__)
    with app.app_context():
        from Advance.auth.routes import auth
        from Advance.admin.routes import admin
        from Advance.chart.routes import chart
        app.register_blueprint(auth,  url_prefix='/auth')
        app.register_blueprint(admin, url_prefix='/admin')
        app.register_blueprint(chart, url_prefix='/chart')
        return app

admin 和图表工作正常,但 auth.routes.py barfs 出现 SQLAlchemy 错误:

from flask import Flask,Blueprint, render_template, redirect, flash, url_for, redirect, request, session
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required
auth=Blueprint('auth', __name__,template_folder='templates',static_folder='static')
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://tag:test@localhost:5432/test'
app.config['SECRET_KEY'] = "what_am_I doing_wrong?"
db = SQLAlchemy()
class Users(db.Model, UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(250), unique=True, nullable=False)
        password = db.Column(db.String(250), nullable=False)
        fullname = db.Column(db.String(250), unique=True, nullable=False)
        email = db.Column(db.String(250), unique=True, nullable=False)
        track = db.Column(db.String(25), unique=True, nullable=False)
        trust = db.Column(db.String(1), unique=True, nullable=False)
db.init_app(app)
with app.app_context():
        db.create_all()
login_manager = LoginManager()
login_manager.init_app(app)
@login_manager.user_loader
def loader_user(user_id):
        return Users.query.get(user_id)
@auth.route("/login", methods=["GET", "POST"])
def login():
        if request.method == "POST":
                user = Users.query.filter_by(
                        username=request.form.get("username")).first()
                if user is None:
                        return render_template('login.html')
                from werkzeug.security import generate_password_hash, check_password_hash
                username=request.form.get("username")
                password=request.form.get("password")
                passwd = check_password_hash(user.password, password)
                if passwd is True:
                        login_user(user)
                        return render_template('index.html')
                else:
                        return render_template('login.html')
        return render_template("login.html")
@auth.route("/logout")
def logout():
        username = session["username"]
        if username is None:
                return redirect(url_for("login"))
        session["username"] = None
        logout_user()
        return render_template('login.html')
from flask import Flask
app=Flask(__name__)
app.register_blueprint(auth)
if __name__ == "__main__":
        auth.run()

最后:我看到 templates.login.html 屏幕,输入凭据,然后出现解析错误。任何帮助表示赞赏。

flask flask-sqlalchemy flask-login
1个回答
0
投票

这是我为遇到此问题的其他人所做的工作:

::::::::::::::
app.py
::::::::::::::

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager

app = Flask(__name__)
app.config['SECRET_KEY'] = 'Shock The Monkey'
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://tag:test@localhost:5432/test'

db = SQLAlchemy(app)

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'auth.login'

from auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint)

from models import Users

@login_manager.user_loader
def load_user(user_id):
    return Users.query.get(int(user_id))

from Advance.admin.routes import admin
from Advance.chart.routes import chart
app.register_blueprint(admin, url_prefix='/admin')
app.register_blueprint(chart, url_prefix='/chart')

if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

::::::::::::::
auth.py
::::::::::::::

from flask import Blueprint, render_template, redirect, url_for, request, flash, session
from flask_login import login_user, logout_user, login_required, current_user
from werkzeug.security import generate_password_hash, check_password_hash
from models import Users
from app import db

auth = Blueprint('auth', __name__)

@auth.route('/')
@login_required
def home():
        return render_template('index.html')

@auth.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':

                logout_user()
                user = Users.query.filter_by(
                        username=request.form.get("username")).first()

                if user is None:

                        return render_template('login.html')

                from werkzeug.security import generate_password_hash, check_password_hash
                username=request.form.get("username")
                password=request.form.get("password")
                passwd = check_password_hash(user.password, password)

                if passwd is True:

                        login_user(user)

                return render_template('index.html')

                if passwd is False:

                        return render_template('login.html')

    return render_template("login.html")

@auth.route('/logout')
@login_required
def logout():

    logout_user()
    session["username"] = None

    return render_template('login.html')

::::::::::::::
models.py
::::::::::::::

from app import db
from flask_login import UserMixin

class Users(UserMixin, db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(250), unique=True, nullable=False)
        password = db.Column(db.String(250), nullable=False)
        fullname = db.Column(db.String(250), unique=True, nullable=False)

def __init__(self, username=None, email=None):
        self.username = username
        self.password = password
        self.fullname = fullname

def __repr__(self):
        return f'<Users {self.username!r}>'
© www.soinside.com 2019 - 2024. All rights reserved.