web-dev-qa-db-fra.com

AttributeError: l'objet 'NoneType' n'a pas d'attribut 'drivername'

J'obtiens cette erreur lorsque je démarre mon application. De toute évidence, il a quelque chose avec SQLAlchemy. J'ai travaillé cet exemple avec l'aide de Corey Schaffer Flask tutorial.

> File "C:\Users\Matea\venv\lib\site-packages\flask\app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\Matea\venv\lib\site-packages\flask\app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\Matea\venv\lib\site-packages\flask\app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Matea\venv\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\Matea\venv\lib\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\Matea\venv\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\Matea\venv\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\Matea\venv\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\Matea\venv\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\Matea\venv\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\Matea\myblog\myblog\main\routes.py", line 11, in home
posts = Post.query.order_by(Post.date_posted.desc()).paginate(page=page, per_page=5)
File "C:\Users\Matea\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 514, in __get__
return type.query_class(mapper, session=self.sa.session())
File "C:\Users\Matea\venv\lib\site-packages\sqlalchemy\orm\scoping.py", line 74, in __call__
return self.registry()
File "C:\Users\Matea\venv\lib\site-packages\sqlalchemy\util\_collections.py", line 1001, in __call__
return self.registry.setdefault(key, self.createfunc())
File "C:\Users\Matea\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2950, in __call__
return self.class_(**local_kw)
File "C:\Users\Matea\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 143, in __init__
bind = options.pop('bind', None) or db.engine
File "C:\Users\Matea\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 877, in engine
return self.get_engine()
File "C:\Users\Matea\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 896, in get_engine
return connector.get_engine()
File "C:\Users\Matea\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 556, in get_engine
self._sa.apply_driver_hacks(self._app, info, options)
File "C:\Users\Matea\venv\lib\site-packages\flask_sqlalchemy\__init__.py", line 830, in apply_driver_hacks
if info.drivername.startswith('mysql'):
AttributeError: 'NoneType' object has no attribute 'drivername'

voici du code: cela vient de mon init. py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from flask_mail import Mail
from myblog.config import Config


db = SQLAlchemy()
bcrypt = Bcrypt()
login_manager = LoginManager()
login_manager.login_view = 'users.login'
login_manager.login_message_category = 'info'
mail = Mail()


def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(Config)

    db.init_app(app)
    bcrypt.init_app(app)
    login_manager.init_app(app)
    mail.init_app(app)

    from myblog.users.routes import users
    from myblog.posts.routes import posts
    from myblog.main.routes import main
    from myblog.errors.handlers import errors
    app.register_blueprint(users)
    app.register_blueprint(posts)
    app.register_blueprint(main)
    app.register_blueprint(errors)

    return app

ce code pièce provient de config.py

import os


class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URL')
    MAIL_SERVER = 'smtp.googlemail.com'
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    MAIL_USERNAME = os.environ.get('EMAIL_USER')
    MAIL_PASSWORD = os.environ.get('EMAIL_PASS')

J'espère que vous m'aiderez et s'il manque quelque chose, dites-le moi, merci!

6
Ivan M

si vous avez correctement défini la variable d'environnement dans le . bash_proflie

    export EMAIL_USER='[email protected]'
    export EMAIL_PASS='Yourpassword'
    export SQLALCHEMY_DATABASE_URI='sqlite:///site.db'
    export SECRET_KEY='secretkeyxxxxxxxxxxxxxxxx'

essayez ensuite de redémarrer votre ordinateur.
s'il échoue encore * Essayez de créer la base de données dans python *

from your yourflaskapp import db
db.create_all()

Si votre application est dans les plans

    use from yourapp import create_app
    app = create_app()
    app.app_context().Push()

Actualisez toujours votre éditeur de texte et le terminal après avoir apporté des modifications. Essayez également de vous assurer que vous exécutez votre application dans le bon répertoire.

pour plus d'informations, visitez l'utilisation des plans

http://flask-sqlalchemy.pocoo.org/2.3/contexts/

3
Eric Muhwezi

@Ivan M, je suis en train de suivre le même tutoriel et j'ai également eu ce problème. Cela se produit car l'instructeur a déplacé l'URI de la base de données et d'autres paramètres dans des variables d'environnement (voir Partie 11 à environ la minute 27). C'est une mesure de sécurité et une bonne pratique de développement.
Afin de faire fonctionner les choses via le fichier de configuration, annulez les modifications dans init.py et mettez à jour config.py pour avoir le lien direct au lieu des crochets:
SQLALCHEMY_DATABASE_URI = 'sqlite:///site.db'
UPD: il en va de même pour SECRET_KEY et autres paramètres que vous souhaitez coder en dur:
SECRET_KEY = '5791628bb0b13ce0c676dfde280ba245'

2
Nick

Le problème est que vous n'avez pas passé le app à SQLAlchemy; cela devrait faire. mais généralement cette erreur signifie que votre connexion à la base de données n'est pas définie ou que vous n'avez pas le jeu de pilotes de base de données approprié.

Essaye ça:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
0
Julian Camilleri