【问题标题】:Flask: 'NoneType' object has no attribute 'drivername' when querying a table from Python terminalFlask:从 Python 终端查询表时,“NoneType”对象没有属性“drivername”
【发布时间】: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

此文件是名为 ma​​in

的主包的一部分
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 是的,我不是它的一些随机生成的字符串,但我只是将其更改为秘密以简洁。

标签: python sqlite flask


【解决方案1】:

这是一个非常普遍的错误,因为这意味着在某处你有一个类型为NoneType 的对象,而据我所知None 没有属性,所以它会引发@987654323 @。查看问题上下文,我认为最可能的错误是指返回 None 的数据库查询。

因此,当您执行以下操作时,请在代码中寻找一点:

x = Card.query.get(65) # let's say there are only 52 cards, so this is None
return x.drivername

这将导致AttributeError 并明显使您的代码崩溃。所以它会出现在create_app 导入的任何文件中,以及它们自己导入的任何文件中(如果数量很多,请考虑您最常使用数据库查询的位置)。

【讨论】:

  • 在我的路线中查询工作正常。例如,当我创建一个新用户时,我将创建查询数据库以检查现有用户是否使用过相同的电子邮件,然后我没有遇到任何错误。我正在尝试通过 Python 终端操作我的数据库/表,这就是我遇到问题的地方。
  • @aDabOfRanch 好的,但是当您在终端中运行它时,没有提供AttributeError——这是您的代码的问题。要么就是这样,要么你奇怪地设置了你的 shell 上下文。
  • 这与我发布的错误相同:当我在终端中运行时,AttributeError: 'NoneType' object has no attribute 'drivername'。在顶部查看我的编辑。老实说,我认为我缺少一些导入,因为如果我对 .env 文件中的值进行硬编码,它运行良好。
  • @aDabOfRanch 也许您的load_dotenv() 不起作用——您不需要将文件路径放入其中吗?喜欢:load_dotenv("path/to/file/.env")
【解决方案2】:

是的,我在 python 终端中所要做的就是使用 load_dotenv() 和 find_dotenv() 函数加载 .env 文件。本质上,在调用 create_app 之前,您需要加载环境变量,我没有在 Python 终端中将其作为命令输入,而是在我的脚本中自动运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 2022-11-28
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2014-12-29
    • 2020-06-25
    • 2021-12-26
    相关资源
    最近更新 更多