I bumped into the error when running python3 manage.py runserver.
I have mydb.py in the project's root directory (same as manage.py), in order to connect to MySQL and create a database (if it does not exist).
project
│
└───todo
│ │ ...
│ │ settings.py
│ │ ...
│
└───.env
└───mydb.py
└───...
mydb.py and settings.py share same database configuration which is loaded from environment variables in .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()
...
Problem:
I keep getting the following error, even though DB_HOST is already set in .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'
I have checked AttributeError: 'NoneType' object has no attribute 'startswith' while makemigrations with manage.py in django and some other related questions, but did not find any help.
Thank you
os.environ.get('DB_HOST')returnedNone, because the dotenv loading somehow didn't do what you expected. Start withprint(os.environ)…?os.environ: environ({..., 'VIRTUAL_ENV_PROMPT': '(.venv) ', ..., 'ENV': 'DEV', 'SECRET_KEY': 'django-insecure-9#1j%osjd33e', 'DB_NAME': 'todolist', 'DB_USER': 'user', 'DB_PASSWORD': '12345', 'DB_HOST': 'localhost', 'DB_PORT': '3306', 'TZ': 'UTC', 'RUN_MAIN': 'true'})'':print(DATABASES)output the expected database config…?