I've been learning the flask web application framework and feel quite comfortable with it. I've previously built a simple to do app that worked perfectly. I was working on the same project, but trying to implement it using TDD. I've encountered an error with the database that I've never seen before and don't know how to fix.
When I examine my code, I cant see any issue. It also looks identical to the code of the working project, so I really don't know what I am doing wrong.
Here is the errors:
(env) PS C:\coding-projects\task-master-tdd> flask shell
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:43:08) [MSC v.1926 32 bit (Intel)] on win32
App: project [development]
Instance: C:\coding-projects\task-master-tdd\instance
>>> from project import db
>>> db
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 1060, in __repr__
self.engine.url if self.app or current_app else None
File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 943, in engine
return self.get_engine()
File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 962, in get_engine
return connector.get_engine()
File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 555, in get_engine
options = self.get_options(sa_url, echo)
File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 570, in get_options
self._sa.apply_driver_hacks(self._app, sa_url, options)
File "c:\coding-projects\task-master-tdd\env\lib\site-packages\flask_sqlalchemy\__init__.py", line 914, in apply_driver_hacks
sa_url.database = os.path.join(app.root_path, sa_url.database)
AttributeError: can't set attribute
>>>
my config.py file:
import os
# load the environment variables from the .env file
from dotenv import load_dotenv
load_dotenv()
# Determine the folder of the top-level directory of this project
BASEDIR = os.path.abspath(os.path.dirname(__file__))
class Config:
FLASK_ENV = 'development'
TESTING = False
DEBUG = False
SECRET_KEY = os.getenv('SECRET_KEY', default='A very terrible secret key.')
SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL',
default=f"sqlite:///{os.path.join(BASEDIR, 'instance', 'app.db')}")
SQLALCHEMY_TRACK_MODIFICATIONS = False
class DevelopmentConfig(Config):
DEBUG = True
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL',
default=f"sqlite:///{os.path.join(BASEDIR, 'instance', 'test.db')}")
class ProductionConfig(Config):
FLASK_ENV = 'production'
my user model:
from project import db, login_manager
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String, unique=True)
hashed_password = db.Column(db.String)
def __init__(self, username, password):
self.username = username
self.hashed_password = generate_password_hash(password)
def is_password_valid(self, password):
return check_password_hash(self.hashed_password, password)
def __repr__(self):
return '<User {}>'.format(self.id)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))