Django 基础入门:命令、结构与核心配置全解析

对于 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 startprojectpython 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.comhttp://example.com:协议不同 → 跨域
  • https://a.comhttps://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库并配置允许的源、方法和头部,即可安全地实现跨域资源共享。生产环境务必精确控制允许的域名,避免安全漏洞。

相关推荐
你的人类朋友3 小时前
认识一下Bcrypt哈希算法
后端·安全·程序员
tangweiguo030519873 小时前
基于 Django 与 Bootstrap 构建的现代化设备管理平台
后端·django·bootstrap
闲人编程3 小时前
Flask 前后端分离架构实现支付宝电脑网站支付功能
python·架构·flask·支付宝·前后端·网站支付·apl
IT果果日记3 小时前
详解DataX开发达梦数据库插件
大数据·数据库·后端
996终结者3 小时前
同类软件对比(四):Jupyter vs PyCharm vs VS Code:Python开发工具终极选择指南
vscode·python·jupyter·pycharm·visual studio code
dazhong20123 小时前
Spring Boot 项目新增 Module 完整指南
java·spring boot·后端
果壳~3 小时前
【Python】爬虫html提取内容基础,bs4
爬虫·python·html
bobz9653 小时前
Cilium + Kubevirt 与 Kube-OVN + Kubevirt 在公有云场景下的对比与选择
后端
David爱编程4 小时前
深度解析:synchronized 性能演进史,从 JDK1.6 到 JDK17
java·后端