运行时遇到错误
python3 manage.py runserver
。
我在项目的根目录中有
mydb.py
(与manage.py
相同),以便连接到MySQL并创建数据库(如果不存在)。
project
│
└───todo
│ │ ...
│ │ settings.py
│ │ ...
│
└───.env
└───mydb.py
└───...
mydb.py
和 settings.py
共享相同的数据库配置,该配置是从 .env
中的环境变量加载的。
.env
:
ENV=DEV
SECRET_KEY='django-insecure-9#1j%osjd33e'
DB_NAME=todolist
DB_USER=user
DB_PASSWORD=12345
DB_HOST=localhost
DB_PORT=3306
settings.py
:
import os
from os.path import join, dirname
from dotenv import load_dotenv, find_dotenv
# (1)
ENV = os.environ.get('ENV')
if ENV == 'PROD':
env_filename = '.env.prod'
elif ENV == 'TEST':
env_filename = '.env.test'
# elif ENV == 'DEV':
# env_filename = '.env.dev'
else:
env_filename = '.env'
dotenv_path = join(dirname(__file__), env_filename)
load_dotenv(dotenv_path)
...
# Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': os.environ.get('DB_NAME'),
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASSWORD'),
'HOST': os.environ.get('DB_HOST'),
'PORT': os.environ.get('DB_PORT'),
}
}
...
mydb.py
:
import mysql.connector
import os
from os.path import join, dirname
from dotenv import load_dotenv, find_dotenv
ENV = os.environ.get('ENV')
if ENV == 'PROD':
env_filename = '.env.prod'
elif ENV == 'TEST':
env_filename = '.env.test'
# elif ENV == 'DEV':
# env_filename = '.env.dev'
else:
env_filename = '.env'
dotenv_path = join(dirname(__file__), env_filename)
load_dotenv(dotenv_path)
dataBase = mysql.connector.connect(
host = os.environ.get('DB_HOST'),
user = os.environ.get('DB_USER'),
passwd = os.environ.get('DB_PASSWORD'),
)
dataBase = mysql.connector.connect()
...
问题:
我不断收到以下错误,即使
DB_HOST
已在 .env
中设置。
...
File "/home/user/django-test/.venv/lib/python3.10/site-packages/django/db/backends/mysql/base.py", line 218, in get_connection_params
if settings_dict["HOST"].startswith("/"):
AttributeError: 'NoneType' object has no attribute 'startswith'
我检查了 AttributeError: 'NoneType' object has no attribute 'startswith' while makemigrations with manage.py in django 以及其他一些相关问题,但没有找到任何帮助。
谢谢你
问题可能是这样的:
join(dirname(__file__), env_filename)
这是在
todo/settings.py
,所以会寻找todo/.env
。
您需要再上一级目录。