Django+PostgreSQL博客搭建报错:数据库URL解析失败,求助解决
Django + PostgreSQL 博客搭建问题:数据库连接失败与模板配置疑问
问题详情
跟着教程用Django和PostgreSQL搭建基础博客网站,目前遇到两个问题:
- 数据库无法正常添加,启动服务器时抛出数据库相关错误
- 已在blog目录下创建
templates文件夹,但Django无法识别,不清楚在settings.py中的正确配置方式
服务器原本运行正常,添加templates文件夹并写入教程要求的views.py代码后,启动时出现以下错误:
Traceback (most recent call last): File "/workspace/django-blog/manage.py", line 22, in <module> main() File "/workspace/django-blog/manage.py", line 18, in main execute_from_command_line(sys.argv) File "/workspace/.pyenv_mirror/user/current/lib/python3.12/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line utility.execute() File "/workspace/.pyenv_mirror/user/current/lib/python3.12/site-packages/django/core/management/__init__.py", line 363, in execute settings.INSTALLED_APPS File "/workspace/.pyenv_mirror/user/current/lib/python3.12/site-packages/django/conf/__init__.py", line 82, in __getattr__ self._setup(name) File "/workspace/.pyenv_mirror/user/current/lib/python3.12/site-packages/django/conf/__init__.py", line 69, in _setup self._wrapped = Settings(settings_module) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/workspace/.pyenv_mirror/user/current/lib/python3.12/site-packages/django/conf/__init__.py", line 170, in __init__ mod = importlib.import_module(self.SETTINGS_MODULE) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/gitpod/.pyenv/versions/3.12.1/lib/python3.12/importlib/__init__.py", line 90, in import_module return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen importlib._bootstrap>", line 1387, in _gcd_import File "<frozen importlib._bootstrap>", line 1360, in _find_and_load File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 935, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 994, in exec_module File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed File "/workspace/django-blog/codestar/settings.py", line 91, in <module> 'default': dj_database_url.parse(os.environ.get("DATABASE_URL")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/workspace/.pyenv_mirror/user/current/lib/python3.12/site-packages/dj_database_url/__init__.py", line 126, in parse raise ValueError( ValueError: No support for 'b'''. We support: cockroach, mssql, mssqlms, mysql, mysql-connector, mysql2, mysqlgis, oracle, oraclegis, pgsql, postgis, postgres, postgresql, redshift, spatialite, sqlite, timescale, timescalegis
教程要求添加的views.py代码如下:
from django.shortcuts import render from django.views import generic from .models import Post # Create your views here. class PostList(generic.ListView): queryset = Post.objects.all() template_name = "post_list.html"
解决方案
1. 修复数据库连接错误
错误提示说明DATABASE_URL环境变量为空或格式无效,导致dj_database_url.parse无法解析。可以通过以下方式解决:
方式一:配置正确的环境变量
确保DATABASE_URL设置为符合PostgreSQL格式的字符串,示例:
postgres://用户名:密码@localhost:5432/数据库名
方式二:直接在settings.py中硬编码数据库配置
如果暂时不需要环境变量,可以替换掉settings.py中数据库相关的代码,改用直接配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': '你的数据库名称', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': 'localhost', # 数据库地址,本地开发一般是localhost 'PORT': '5432', # PostgreSQL默认端口 } }
补充:确保安装PostgreSQL驱动
执行以下命令安装psycopg2(Django连接PostgreSQL所需的驱动):
pip install psycopg2-binary
2. 配置templates文件夹让Django识别
要让Django找到blog目录下的templates文件夹,需要修改settings.py中的TEMPLATES配置:
步骤1:修改TEMPLATES的DIRS项
找到settings.py中的TEMPLATES列表,将DIRS设置为包含blog/templates的路径:
# 用pathlib方式(Django 3.0+推荐) from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'blog' / 'templates'], # 添加这一行 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
或者用os.path方式:
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) TEMPLATES = [ { ... 'DIRS': [os.path.join(BASE_DIR, 'blog', 'templates')], ... }, ]
步骤2:确保blog app已添加到INSTALLED_APPS
检查settings.py的INSTALLED_APPS列表,确认包含'blog':
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', # 确保这一行存在 ]
内容的提问来源于stack exchange,提问作者user23331179
相关产品推荐
相关产品推荐

