我是一名 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 屏幕,输入凭据,然后出现解析错误。任何帮助表示赞赏。
这是我为遇到此问题的其他人所做的工作:
::::::::::::::
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}>'