作为一名使用Django开发过多个项目的Python工程师,我深知一个稳定可靠的开发环境对项目的重要性。PyCharm作为Python开发的首选IDE,与Django框架的深度整合能极大提升开发效率。但在实际工作中,我发现很多新手在搭建环境时会遇到各种"坑",今天我就来分享一套经过实战检验的Django项目创建方法。
PyCharm确实提供了可视化创建Django项目的功能(专业版),但在实际使用中我发现几个问题:
版本兼容性问题:PyCharm内置的Django模板可能与你需要的Django版本不匹配,导致项目结构异常或依赖冲突。我曾遇到过PyCharm 2022.3创建Django 4.1项目时生成空文件夹的情况。
灵活性不足:命令行方式可以精确控制项目参数,比如指定自定义模板、项目目录结构等,这是可视化界面难以实现的。
学习价值更高:理解命令行操作能让你更清楚Django项目的底层结构,对后续部署和维护都有帮助。
提示:虽然本文重点介绍命令行方式,但如果你坚持使用PyCharm可视化创建,务必确保PyCharm和Django版本兼容。建议查看JetBrains官方文档了解版本对应关系。
在开始前,请确保你的系统已安装以下组件:
python -m pip install --upgrade pip更新)建议使用Windows Terminal或Mac/Linux的终端工具,它们比默认的命令行工具功能更强大。
首先,我们需要建立一个清晰的项目目录。不要直接在桌面或下载文件夹中创建项目,这会导致后续路径管理混乱。我推荐以下结构:
bash复制mkdir -p ~/projects/django_projects # 项目总目录
cd ~/projects/django_projects
对于Windows用户,可以在D盘或用户目录下创建专门的项目文件夹:
cmd复制mkdir D:\django_projects
cd D:\django_projects
Django安装后会提供django-admin命令行工具,这是创建项目的标准方式。执行以下命令:
bash复制django-admin startproject myproject
这里有几个关键点需要注意:
项目命名规范:
my_project)class、def等)-),这会导致后续导入问题目录结构说明:
myproject/是项目容器目录,可以重命名myproject/是实际Python包,包含settings.py等核心文件manage.py是项目管理脚本,后续操作都依赖它创建后检查目录是否包含以下文件:
code复制myproject/
├── manage.py
└── myproject/
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
如果缺少任何文件,可能是Django安装有问题。可以运行django-admin --version检查Django是否安装正确。
Python的虚拟环境(venv)有以下关键作用:
site-packages目录进入项目目录并创建虚拟环境:
bash复制cd myproject
python -m venv venv
最佳实践建议:
venv或.venv(后者是PyCharm默认名称).gitignore中添加venv/避免将环境提交到版本控制不同系统激活方式不同:
Windows (CMD):
cmd复制venv\Scripts\activate
Windows (PowerShell):
powershell复制.\venv\Scripts\Activate.ps1
Mac/Linux:
bash复制source venv/bin/activate
激活后,命令行提示符前会显示(venv),表示已进入虚拟环境。
在虚拟环境中运行:
bash复制pip install django==4.1.7
为什么选择4.1.7版本?
bash复制python -m django --version
# 应该输出4.1.7
一个Django项目通常还需要以下包:
bash复制pip install psycopg2-binary # PostgreSQL支持
pip install python-dotenv # 环境变量管理
pip install ipdb # 调试工具
建议将依赖保存到requirements.txt:
bash复制pip freeze > requirements.txt
manage.py的目录)PyCharm可能不会自动识别虚拟环境,需要手动设置:
Ctrl+Alt+S, Mac: Cmd+,)venv/Scripts/python.exe(Windows)或venv/bin/python(Mac/Linux)myproject目录myproject/settings.pyPyCharm提供了专门的Django运行配置:
你也可以在PyCharm的终端中运行:
bash复制python manage.py runserver
访问http://127.0.0.1:8000应该看到Django欢迎页面。
问题1:ModuleNotFoundError: No module named 'django'
解决方案:
pip install django问题2:端口被占用
解决方案:
python manage.py runserver 8001netstat -ano, Mac/Linux: lsof -i :8000)问题3:数据库迁移未完成
解决方案:
python manage.py migrate成熟的Django项目通常会调整默认结构:
code复制myproject/
├── config/ # 原myproject/重命名为config
│ ├── settings/
│ │ ├── __init__.py # 从base.py导入设置
│ │ ├── base.py # 通用设置
│ │ ├── local.py # 开发环境设置
│ │ └── production.py # 生产环境设置
│ ├── urls.py
│ └── wsgi.py
├── apps/ # 自定义应用目录
│ └── core/ # 示例应用
├── static/ # 静态文件
├── templates/ # 全局模板
├── manage.py
└── requirements/ # 分环境依赖文件
├── base.txt
├── local.txt
└── production.txt
myproject为configmanage.py中的os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')为config.settings.localconfig/settings/中创建分环境设置文件apps目录并添加到PYTHONPATH:python复制# config/settings/base.py
import sys
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent.parent
sys.path.append(str(BASE_DIR / "apps"))
永远不要将敏感信息(如SECRET_KEY)硬编码在设置文件中。推荐使用python-dotenv:
.env文件:ini复制SECRET_KEY=your-secret-key-here
DEBUG=True
settings.py:python复制from dotenv import load_dotenv
import os
load_dotenv()
SECRET_KEY = os.getenv('SECRET_KEY')
DEBUG = os.getenv('DEBUG') == 'True'
记得将.env添加到.gitignore!
开发阶段静态文件配置:
python复制# settings/local.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / "static"]
生产环境还需要配置:
python复制# settings/production.py
STATIC_ROOT = BASE_DIR / "staticfiles"
然后运行python manage.py collectstatic收集静态文件。
如果你预计需要扩展用户模型,最好一开始就设置:
bash复制python manage.py startapp accounts
python复制# accounts/models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
python复制AUTH_USER_MODEL = 'accounts.User'
bash复制python manage.py makemigrations
bash复制python manage.py sqlmigrate app_name migration_number
bash复制python manage.py migrate
重要:永远不要手动修改迁移文件,除非你非常清楚后果。如果遇到问题,最好回滚迁移然后重新创建。
PyCharm提供了强大的Django调试支持:
ipdb进行更灵活的调试:python复制# 在代码中插入
import ipdb; ipdb.set_trace()
Django内置测试框架,建议:
tests目录TestCase和Client类bash复制python manage.py test
考虑设置持续集成(CI)自动运行测试。
bash复制# requirements/base.txt
django==4.1.7
psycopg2-binary
python-dotenv
# requirements/local.txt
-r base.txt
ipdb
django-debug-toolbar
# requirements/production.txt
-r base.txt
gunicorn
bash复制pip install -r requirements/local.txt
准备部署时检查:
DEBUG=FalseALLOWED_HOSTS生产环境建议:
django-extensions的runserver_plus开发时有更好的错误页面现象:激活虚拟环境后,python命令仍指向系统Python
原因:
解决方案:
venv/Scripts/activatevenv/bin/activate现象:PyCharm的Django支持功能异常或报错
解决方案:
常见错误:
django.db.utils.OperationalError: could not connect to serverdjango.db.utils.ProgrammingError: relation does not exist排查步骤:
settings.py中的数据库配置python manage.py check --database default测试连接原因:开发和生产环境的静态文件配置不同
开发环境解决方案:
DEBUG=TrueSTATICFILES_DIRS设置django.contrib.staticfiles在INSTALLED_APPS中生产环境解决方案:
collectstaticSTATIC_ROOT权限默认的runserver是单线程的,可以启用多线程:
bash复制python manage.py runserver --threaded
或者使用runserver_plus(来自django-extensions):
bash复制pip install django-extensions
python manage.py runserver_plus --threaded
select_related和prefetch_related减少查询次数django-db-geventpool)python manage.py dbshell检查慢查询{% cache %}标签缓存模板片段django-template-profiler分析性能瓶颈DEBUG=Falsepython复制TEMPLATES = [{
'OPTIONS': {'loaders': [
('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
]),
]},
}]
WhiteNoise优化静态文件服务settings.py中的SECRET_KEYpython复制SECURE_HSTS_SECONDS = 31536000 # 1 year
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
python manage.py check --deploydjango-admin dbshell检查数据库权限pip-audit){% autoescape on %}和mark_safe谨慎django.middleware.csrf.CsrfViewMiddleware启用X-Frame-Options头bash复制pip install djangorestframework
INSTALLED_APPS:python复制INSTALLED_APPS += ['rest_framework']
bash复制pip install celery
celery.py配置文件bash复制pip install channels
README.md说明项目结构docs/目录bash复制pip install sphinx
sphinx-quickstart docs
.gitignore排除敏感文件和目录:code复制venv/
*.pyc
__pycache__/
.env
db.sqlite3
black、flake8)pip-compile)django标签在实际项目开发中,我总结了以下几点心得:
环境隔离至关重要:曾经因为环境混乱导致一个项目在开发机正常但在同事电脑报错,浪费了整整一天排查。现在每个项目都严格使用虚拟环境,并记录准确的依赖版本。
小步快跑:Django的迁移系统非常强大,但最好频繁创建和应用小迁移,而不是一次性做大量模型变更。我曾经一次修改了10个模型,结果迁移冲突解决起来非常痛苦。
善用PyCharm功能:
测试先行:虽然Django开发可以很快速,但没有测试覆盖的代码迟早会成为负担。建议至少为核心业务逻辑编写测试。
监控生产环境:曾经因为没配置错误监控,一个生产环境bug三天后才被发现。现在所有项目都配置了Sentry和性能监控。
Django是一个强大而灵活的框架,PyCharm提供了完美的开发环境支持。掌握这些工具的组合使用,可以让你在Web开发中事半功倍。记住,好的开始是成功的一半,花时间搭建一个合理的项目结构,会在后续开发中带来巨大回报。