对于 Python Web 开发者而言,Django 作为一款 "大而全" 的 Web 框架,凭借其强大的功能和完善的生态,成为开发高效 Web 应用的首选。本文将从 Django 的常用命令出发,带你解析项目结构,并深入讲解 settings.py 中的核心配置,为你的 Django 开发之路打下坚实基础。
一、Django命令详解
Django 提供了丰富的命令行工具,帮助开发者快速完成项目创建、应用开发、服务器启动等一系列操作。以下是最常用的核心命令。
1.1 创建新项目
当我们需要开启一个全新的 Django 项目时,可使用**django-admin startproject
** 命令。语法格式如下:
bash
django-admin startproject <项目名>
示例:

- 作用:该命令会在当前目录下生成一个以项目名称命名的文件夹,同时创建项目的核心配置文件,构建起 Django 项目的基本框架。
- 可选参数 :
--template
可指定项目模板路径,用于创建符合特定规范的项目;--extension
可指定生成文件的扩展名。
1.2 创建新应用
Django 项目采用 "项目 - 应用" 的架构,一个项目可包含多个应用,每个应用负责实现特定的功能模块(如用户模块、商品模块等)。创建应用使用**python manage.py startapp
** 命令,语法如下:
bash
python manage.py startapp 应用名称
示例:
①直接在终端使用指令:
②在工具中运行manage.py文件(指令补全,不需要前一段python manage.py):
小宁更加推荐这种写法,后续演示都是通过这种方式!!!


- 作用:生成一个以应用名称命名的文件夹,包含应用的模型、视图、路由等相关文件,用于独立开发特定功能。
- 注意 :创建应用后,需在项目的
settings.py
文件的INSTALLED_APPS
列表中注册应用,否则 Django 无法识别该应用。
1.3 启动服务器
开发过程中,我们需要频繁查看应用效果,Django 内置了开发服务器,使用python manage.py runserver
命令即可启动。语法如下:
bash
python manage.py runserver
示例 1:默认启动(IP 为 127.0.0.1,端口为 8000)
python manage.py runserver
示例 2:指定 IP 和端口启动(如 IP 为 0.0.0.0,端口为 8080,允许同一局域网内其他设备访问)
bash
python manage.py runserver 127.0.0.1:8080

- 作用:启动轻量级的开发服务器,支持自动重载,当代码修改后无需重启服务器即可生效(部分配置修改除外)。
- 注意:该服务器仅用于开发环境,不适合生产环境,生产环境需使用 Nginx、Gunicorn 等专业服务器。
1.4 数据库迁移(模型层的时候细讲)
Django 的 ORM(对象关系映射)机制允许开发者通过 Python 代码定义数据模型,再通过迁移命令将模型映射到数据库中。核心迁移命令包括以下两个:
1.生成迁移文件:根据模型的修改生成对应的数据库迁移脚本
python manage.py makemigrations [应用名称]
若指定应用名称,仅为该应用生成迁移文件;不指定则为所有修改过模型的应用生成。
示例:为 "users" 应用生成迁移文件
python manage.py makemigrations users
2.执行迁移操作:将迁移文件中的操作应用到数据库,创建或更新数据表
python manage.py migrate [应用名称] [迁移版本号]
若不指定应用名称,将执行所有应用的未完成迁移;指定迁移版本号可回滚到特定版本(如0001
)。
**示例:**执行所有应用的迁移
python manage.py migrate
二、项目结构解析
通过django-admin startproject
和python manage.py startapp
命令创建项目和应用后,会生成一套标准的目录结构。下面分别解析项目级和应用级结构。
2.1 整体项目结构
以 "projectDjangoProjecta" 项目为例,整体项目目录结构如下:

件/目录 | 详细说明 |
---|---|
manage.py |
Django 项目的命令行管理工具,封装了 django-admin 的功能,并自动设置 DJANGO_SETTINGS_MODULE 环境变量指向当前项目的配置。所有项目管理命令都通过它执行,如: - runserver :启动开发服务器 - makemigrations :生成数据库迁移文件 - shell :启动带 ORM 的 Python shell |
db.sqlite3 |
Django 默认使用的 SQLite 数据库文件,在首次执行 migrate 命令后自动生成。开发环境适用,生产环境建议换用 PostgreSQL/MySQL。文件位置由 settings.py 中的 DATABASES['default']['NAME'] 定义。 |
2.2 主应用结构
以 "projectDjangoProjecta" 项目为例,主应用结构如下:

文件/目录 | 描述 |
---|---|
projectDjangoProjecta | 项目根目录,包含项目的配置和管理文件 |
init.py | 空文件,表示该目录为Python包 |
asgi.py | ASGI配置文件,用于异步web服务器部署 |
settings.py | 项目核心配置文件(重点),包含了数据库、安全设置、中间件等重要配置 |
urls.py | 项目主路由配置文件,映射URL到视图,控制请求如何被处理和响应 |
wsgi.py | WSGI配置文件,用于传统web服务器部署,如Apache或Nginx |
此外,图片中还显示了其他一些目录和文件,它们也是项目的重要组成部分:
- Smyapp1 和 Smyapp2:这些可能是项目的应用模块,每个应用通常有自己的视图、模型和模板。
- templates:存放HTML模板文件,用于渲染网页。
- db.sqlite3:SQLite数据库文件,存储项目的数据。
- manage.py:Django项目的管理脚本,用于执行各种命令,如运行服务器、迁移数据库等。

2.3 子应用结构
以 "projectDjangoProjecta" 项目为例,子应用结构 如下:
目录
- migrations: 这个目录包含了所有与数据库迁移相关的文件。每当模型(models.py)发生变化时,Django会生成一个新的迁移文件来记录这些变化,以便在不同的环境中同步数据库结构。
文件
-
init.py: 空文件,用于将该目录标记为Python包,使得Python能够导入这个目录下的模块。
-
admin.py: 定义了如何在Django管理后台中显示和操作模型的数据。通过在这个文件中注册模型,可以方便地对数据进行增删改查等操作。
-
apps.py: 包含了应用配置类,定义了应用的基本信息,如名称、标签等。通常不需要修改,除非有特殊需求。
-
models.py: 定义了应用的数据模型,即数据库表的结构。每个模型对应数据库中的一个表,模型的字段则对应表中的列。
-
tests.py: 包含了应用的测试用例。通过编写测试,可以确保应用的功能正确无误,并且在后续开发中不会引入新的错误。
-
views.py: 定义了视图函数或类,处理HTTP请求并返回HTTP响应。视图是连接URL和模板的桥梁,负责业务逻辑的实现。
三、settings中的核心配置
settings.py
文件是 Django 项目的 "总开关",涵盖了项目路径、安全、应用、数据库、模板等核心配置。以下将结合你文件中的具体内容,逐模块拆解每个配置项的作用、场景与实用技巧,帮你彻底理解并灵活运用。
3.1 基本配置
项目基本信息:
python
# 项目名称,Django自动生成,通常无需修改
ROOT_URLCONF = 'myproject.urls'
# WSGI配置,用于部署
WSGI_APPLICATION = 'myproject.wsgi.application'
# 项目名称,Django 3.2+新增,用于标识项目
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
密钥配置:
python
# 项目密钥,用于加密会话数据、密码重置令牌等
# 生产环境中务必使用环境变量或配置文件管理,不要硬编码
SECRET_KEY = 'django-insecure-your-secret-key-here'
# 调试模式,开发环境设为True,生产环境必须设为False
# 开启调试模式时,Django会显示详细错误信息
DEBUG = True
# 允许访问的主机列表,调试模式下可以设为['*']
# 生产环境需要指定具体的域名或IP
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
注意 :SECRET_KEY
在生产环境中必须保密,建议使用环境变量的方式加载:
python
import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
3.2 应用与中间件配置
已安装应用:
python
# 项目中启用的应用列表
INSTALLED_APPS = [
# Django内置应用
'django.contrib.admin', # 管理后台
'django.contrib.auth', # 认证系统
'django.contrib.contenttypes', # 内容类型框架
'django.contrib.sessions', # 会话框架
'django.contrib.messages', # 消息框架
'django.contrib.staticfiles', # 静态文件管理
# 第三方应用
'rest_framework', # Django REST framework示例
# 本地应用
'myapp', # 自定义应用
]
中间件配置:
python
# 中间件是处理请求和响应的钩子框架
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', # 安全相关中间件
'django.contrib.sessions.middleware.SessionMiddleware', # 会话管理
'django.middleware.common.CommonMiddleware', # 通用中间件
'django.middleware.csrf.CsrfViewMiddleware', # CSRF保护
'django.contrib.auth.middleware.AuthenticationMiddleware', # 认证中间件
'django.contrib.messages.middleware.MessageMiddleware', # 消息中间件
'django.middleware.clickjacking.XFrameOptionsMiddleware', # 点击劫持保护
]
提示:中间件的顺序很重要,它们按照列表中的顺序处理请求,逆序处理响应。
3.3 数据库配置
Django 支持多种数据库后端,最常用的是 SQLite、PostgreSQL、MySQL 等。
SQLite 配置(默认)
python
# SQLite配置,适用于开发环境
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # 数据库引擎
'NAME': BASE_DIR / 'db.sqlite3', # 数据库文件路径
}
}
PostgreSQL 配置
python
# PostgreSQL配置,适用于生产环境
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase', # 数据库名
'USER': 'mydatabaseuser', # 数据库用户
'PASSWORD': 'mypassword', # 密码
'HOST': 'localhost', # 数据库主机
'PORT': '5432', # 端口号
}
}
MySQL 配置
python
# MySQL配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '3306',
# 额外选项
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
}
}
}
3.4静态文件与媒体文件配置
静态文件配置
python
# 静态文件(CSS、JavaScript、图片等)配置
STATIC_URL = '/static/' # 静态文件的URL前缀
# 开发环境中静态文件的存放目录
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
# 生产环境中,执行collectstatic命令后静态文件的存放目录
STATIC_ROOT = BASE_DIR / 'staticfiles'
# 静态文件查找器
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
媒体文件配置
python
# 用户上传文件的配置
MEDIA_URL = '/media/' # 媒体文件的URL前缀
# 媒体文件的存放目录
MEDIA_ROOT = BASE_DIR / 'media'
注意:在开发环境中,需要配置 URL 模式来提供媒体文件访问:
python
# 在主urls.py中
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... 其他URL配置
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
3.5 模板配置
python
# 模板配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates', # 模板引擎
'DIRS': [BASE_DIR / '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',
],
},
},
]
3.6 国际化与本地化
python
# 语言代码,如中文为'zh-hans'
LANGUAGE_CODE = 'en-us'
# 时区设置,如中国时区为'Asia/Shanghai'
TIME_ZONE = 'UTC'
# 是否启用国际化
USE_I18N = True
# 是否启用本地化
USE_L10N = True
# 是否使用时区感知 datetime 对象
USE_TZ = True
# 支持的语言列表
LANGUAGES = [
('en', 'English'),
('zh-hans', 'Chinese (Simplified)'),
]
# 翻译文件存放目录
LOCALE_PATHS = [
BASE_DIR / 'locale',
]
3.7 安全设置
python
SECURE_SSL_REDIRECT = False # 是否自动将HTTP请求重定向到HTTPS(生产环境建议设为True)
SESSION_COOKIE_SECURE = False # 会话Cookie是否仅通过HTTPS传输(生产环境建议设为True)
CSRF_COOKIE_SECURE = False # CSRF Cookie是否仅通过HTTPS传输(生产环境建议设为True)
X_FRAME_OPTIONS = 'DENY' # 防点击劫持(禁止当前站点被嵌入iframe)
# SECURE_CONTENT_TYPE_NOSNIFF = True # 防止浏览器猜测文件类型(避免MIME类型混淆攻击)
# SECURE_BROWSER_XSS_FILTER = True # 启用浏览器内置XSS过滤
# SECURE_HSTS_SECONDS = 31536000 # HSTS设置(强制浏览器长期使用HTTPS,单位秒)
# SECURE_HSTS_INCLUDE_SUBDOMAINS = True # HSTS包含子域名
# SECURE_HSTS_PRELOAD = True # 允许将站点加入浏览器HSTS预加载列表
3.8 日志配置
python
LOGGING = {
'version': 1, # 日志配置版本(固定为1)
'disable_existing_loggers': False, # 是否禁用已存在的日志器
'formatters': { # 日志格式化器(定义日志输出格式)
'verbose': {
'format': '{levelname} {asctime} {module} {message}', # 日志格式(级别、时间、模块、消息)
'style': '{', # 格式化风格(使用{}占位符)
},
},
'handlers': { # 日志处理器(定义日志输出位置)
'file': { # 输出到文件
'level': 'WARNING', # 记录WARNING及以上级别日志
'class': 'logging.FileHandler', # 文件处理器
'filename': BASE_DIR / 'logs/django.log', # 日志文件路径
'formatter': 'verbose', # 使用verbose格式
},
'console': { # 输出到控制台
'level': 'INFO', # 记录INFO及以上级别日志
'class': 'logging.StreamHandler', # 控制台处理器
'formatter': 'verbose',
},
},
'loggers': { # 日志记录器(定义哪些模块的日志被处理)
'django': { # Django框架本身的日志
'handlers': ['file', 'console'], # 使用file和console处理器
'level': 'INFO', # 记录INFO及以上级别
'propagate': True, # 是否向上级日志器传播
},
'myapp': { # 自定义应用myapp的日志
'handlers': ['file', 'console'],
'level': 'INFO',
'propagate': False, # 不向上传播(避免重复记录)
},
},
}
3.9 缓存配置
python
# 开发环境缓存(本地内存缓存)
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 内存缓存后端
'LOCATION': 'unique-snowflake', # 缓存实例唯一标识
}
}
# 生产环境Redis缓存(需安装django-redis)
# CACHES = {
# 'default': {
# 'BACKEND': 'django_redis.cache.RedisCache', # Redis缓存后端
# 'LOCATION': 'redis://127.0.0.1:6379/1', # Redis服务器地址和数据库编号
# 'OPTIONS': {
# 'CLIENT_CLASS': 'django_redis.client.DefaultClient', # Redis客户端类
# }
# }
# }
四、Django中配置CORS**(跨域资源共享)**
在 Django 开发中,跨域资源共享(CORS,Cross-Origin Resource Sharing) 是解决前后端分离架构中,不同域(域名、端口、协议不同)之间 API 请求被浏览器拦截的问题。
4.1 什么是跨域?
浏览器的同源策略(Same-Origin Policy)是一种安全机制,限制一个域的网页脚本(如 JavaScript)对另一个域的资源(如 API 接口)进行访问。
"同源" 指的是 协议、域名、端口三者完全相同。例如:
http://localhost:3000
(前端)与http://localhost:8000
(Django 后端):端口不同 → 跨域https://example.com
与http://example.com
:协议不同 → 跨域https://a.com
与https://b.com
:域名不同 → 跨域
4.2 跨域问题的表现
当前端(如 React、Vue)从跨域地址请求 Django 后端 API 时,浏览器控制台会出现类似错误:
Access to fetch at 'http://localhost:8000/api/data/' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
原因是:浏览器在跨域请求时会先发送一个预检请求(OPTIONS 请求),检查后端是否允许该跨域请求。如果后端未配置 CORS,会拒绝该请求,导致前端无法获取数据。
4.3 Django 中如何配置 CORS?
Django 本身不内置 CORS 支持,需通过第三方库 django-cors-headers
解决,步骤如下:
步骤 1:安装库
bash
pip install django-cors-headers
步骤 2:修改 settings.py 配置
python
# 1. 添加到INSTALLED_APPS
INSTALLED_APPS = [
# ... 其他应用
'corsheaders', # 新增:注册corsheaders应用
]
# 2. 添加中间件(必须放在CommonMiddleware之前)
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 新增:CORS中间件(关键)
'django.middleware.common.CommonMiddleware', # 原有中间件
# ... 其他中间件
]
# 3. 配置允许的跨域源(核心配置)
# 开发环境:允许所有源(方便调试,生产环境禁用)
CORS_ALLOW_ALL_ORIGINS = True # 不推荐生产环境使用
# 生产环境:指定允许的源(精确控制,更安全)
CORS_ALLOWED_ORIGINS = [
"https://example.com", # 允许example.com的请求
"https://www.example.com",
"http://localhost:3000", # 允许本地前端(如Vue/React)
]
# 4. 可选配置:允许的HTTP方法
CORS_ALLOW_METHODS = [
"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS" # 默认已包含这些方法
]
# 5. 可选配置:允许的请求头(如自定义 headers)
CORS_ALLOW_HEADERS = [
"accept", "accept-encoding", "authorization", "content-type", "dnt",
"origin", "user-agent", "x-csrftoken", "x-requested-with",
"my-custom-header" # 允许自定义请求头
]
# 6. 可选配置:允许携带Cookie(跨域请求默认不携带Cookie)
CORS_ALLOW_CREDENTIALS = True # 需前端请求时配合设置withCredentials: true
CORS 是解决前后端分离架构中跨域 API 请求被浏览器拦截的核心方案。在 Django 中,通过django-cors-headers
库并配置允许的源、方法和头部,即可安全地实现跨域资源共享。生产环境务必精确控制允许的域名,避免安全漏洞。