我一直在学习 Flask Web 应用程序框架,并对它感到非常舒适。我以前构建过一个简单的待办事项应用程序,它可以完美地工作。我正在尝试使用 TDD 实现同一个项目,但是遇到了一个我从未见过且不知道如何解决的数据库错误。
当我检查我的代码时,我没有发现任何问题。它看起来与工作中的项目代码完全相同,所以我真的不知道自己做错了什么。
以下是错误信息:
当我检查我的代码时,我没有发现任何问题。它看起来与工作中的项目代码完全相同,所以我真的不知道自己做错了什么。
以下是错误信息:
(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
>>>
我的config.py文件:
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'
我的用户模型:
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))