【发布时间】:2020-12-23 03:12:05
【问题描述】:
编辑:我在 config.py 中添加了以下几行:
print(type(SECRET_KEY), SECRET_KEY)
print(type(SQLALCHEMY_DATABASE_URI), SQLALCHEMY_DATABASE_URI)
print(SQLALCHEMY_DATABASE_URI == "sqlite:///site.db")
然后当我用 python run.py 启动烧瓶应用程序时,我得到了输出
<class 'str'> secret
<class 'str'> sqlite:///site.db
True
当我运行以下命令时,现在在 python 终端中
>>> from main import create_app, db
我得到输出
<class 'NoneType'> None
<class 'NoneType'> None
False
所以似乎没有从 .env 文件中加载这些值。我错过了任何进口吗?因为如果将 SQLALCHEMY_DATABASE_URI 的值硬编码为 sqlite:///site.db 输出变为:
<class 'NoneType'> None
<class 'str'> sqlite:///site.db
True
我正在开发一个 Flask 应用程序,并使用蓝图对其进行了重组。在此更改之后,当我尝试与数据库中的表进行交互时,会引发以下错误:
'NoneType' object has no attribute 'drivername'
我正在使用 dotenv 包从 .env 文件加载任何秘密值或数据库 URI。事实上,在前端应用程序正在工作,因为当我进行更改时,它们会被保存并呈现在页面上。但是,我想通过表格处理表格以快速创建虚拟数据,但由于某种原因我不是。
__ 初始化 __.py
此文件是名为 main
的主包的一部分from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from main.config import Config
db = SQLAlchemy()
bcrypt = Bcrypt()
login = LoginManager()
login.login_view = 'users.login'
def create_app(config_class=Config):
# Create app and setup config
app = Flask(__name__)
app.config.from_object(Config)
# Link extensions to the app
db.init_app(app)
bcrypt.init_app(app)
login.init_app(app)
# Add route imports
from main.users.routes import users
from main.decks.routes import decks
from main.cards.routes import cards
from main.errors.handlers import errors
# Register blueprints
app.register_blueprint(users)
app.register_blueprint(decks)
app.register_blueprint(cards)
app.register_blueprint(errors)
return app
config.py
>from dotenv import load_dotenv
import os
load_dotenv()
class Config():
SECRET_KEY = os.getenv('SECRET_KEY')
SQLALCHEMY_DATABASE_URI = os.getenv('SQLALCHEMY_DATABASE_URI')
.env
SECRET_KEY="secret"
SQLALCHEMY_DATABASE_URI="sqlite:///site.db"
这就是我尝试从 python 终端与表交互的方式
>> from main import db, create_app
>> from main.models import Card
>> app = create_app()
>> with app.app_context():
Card.query.first()
AttributeError: 'NoneType' object has no attribute 'drivername'
【问题讨论】:
-
也许不要使用“secret”作为访问您应用程序的密钥?
-
@monsieuralfonse64 是的,我不是它的一些随机生成的字符串,但我只是将其更改为秘密以简洁。