当前位置: 首页 > news >正文

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

对于 Python Web 开发者而言,Django 作为一款 “大而全” 的 Web 框架,凭借其强大的功能和完善的生态,成为开发高效 Web 应用的首选。本文将从 Django 的常用命令出发,带你解析项目结构,并深入讲解 settings.py 中的核心配置,为你的 Django 开发之路打下坚实基础。

一、Django命令详解

Django 提供了丰富的命令行工具,帮助开发者快速完成项目创建、应用开发、服务器启动等一系列操作。以下是最常用的核心命令。

1.1 创建新项目

当我们需要开启一个全新的 Django 项目时,可使用django-admin startproject命令。语法格式如下:

django-admin startproject <项目名>

示例

  • 作用:该命令会在当前目录下生成一个以项目名称命名的文件夹,同时创建项目的核心配置文件,构建起 Django 项目的基本框架。
  • 可选参数--template可指定项目模板路径,用于创建符合特定规范的项目;--extension可指定生成文件的扩展名。

1.2 创建新应用

Django 项目采用 “项目 - 应用” 的架构,一个项目可包含多个应用,每个应用负责实现特定的功能模块(如用户模块、商品模块等)。创建应用使用python manage.py startapp命令,语法如下

python manage.py startapp 应用名称

示例

①直接在终端使用指令:


②在工具中运行manage.py文件(指令补全,不需要前一段python manage.py):

小宁更加推荐这种写法,后续演示都是通过这种方式!!!

  • 作用:生成一个以应用名称命名的文件夹,包含应用的模型、视图、路由等相关文件,用于独立开发特定功能。
  • 注意:创建应用后,需在项目的settings.py文件的INSTALLED_APPS列表中注册应用,否则 Django 无法识别该应用。

1.3 启动服务器

开发过程中,我们需要频繁查看应用效果,Django 内置了开发服务器,使用python manage.py runserver命令即可启动。语法如下:

python manage.py runserver

示例 1:默认启动(IP 为 127.0.0.1,端口为 8000)

python manage.py runserver

示例 2:指定 IP 和端口启动(如 IP 为 0.0.0.0,端口为 8080,允许同一局域网内其他设备访问)

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.pyDjango 项目的命令行管理工具,封装了 django-admin 的功能,并自动设置 DJANGO_SETTINGS_MODULE 环境变量指向当前项目的配置。所有项目管理命令都通过它执行,如:
runserver:启动开发服务器
makemigrations:生成数据库迁移文件
shell:启动带 ORM 的 Python shell
db.sqlite3Django 默认使用的 SQLite 数据库文件,在首次执行 migrate 命令后自动生成。开发环境适用,生产环境建议换用 PostgreSQL/MySQL。文件位置由 settings.py 中的 DATABASES['default']['NAME'] 定义。

2.2 主应用结构

以 “projectDjangoProjecta” 项目为例,主应用结构如下:

文件/目录描述
projectDjangoProjecta项目根目录,包含项目的配置和管理文件
init.py空文件,表示该目录为Python包
asgi.pyASGI配置文件,用于异步web服务器部署
settings.py项目核心配置文件(重点),包含了数据库、安全设置、中间件等重要配置
urls.py项目主路由配置文件,映射URL到视图,控制请求如何被处理和响应
wsgi.pyWSGI配置文件,用于传统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 基本配置

项目基本信息:

# 项目名称,Django自动生成,通常无需修改
ROOT_URLCONF = 'myproject.urls'# WSGI配置,用于部署
WSGI_APPLICATION = 'myproject.wsgi.application'# 项目名称,Django 3.2+新增,用于标识项目
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

密钥配置:

# 项目密钥,用于加密会话数据、密码重置令牌等
# 生产环境中务必使用环境变量或配置文件管理,不要硬编码
SECRET_KEY = 'django-insecure-your-secret-key-here'# 调试模式,开发环境设为True,生产环境必须设为False
# 开启调试模式时,Django会显示详细错误信息
DEBUG = True# 允许访问的主机列表,调试模式下可以设为['*']
# 生产环境需要指定具体的域名或IP
ALLOWED_HOSTS = ['localhost', '127.0.0.1']

注意SECRET_KEY在生产环境中必须保密,建议使用环境变量的方式加载:

import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')

3.2 应用与中间件配置

已安装应用:

# 项目中启用的应用列表
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',                         # 自定义应用
]

中间件配置:

# 中间件是处理请求和响应的钩子框架
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 配置(默认)

# SQLite配置,适用于开发环境
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3',  # 数据库引擎'NAME': BASE_DIR / 'db.sqlite3',         # 数据库文件路径}
}

PostgreSQL 配置

# PostgreSQL配置,适用于生产环境
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql','NAME': 'mydatabase',          # 数据库名'USER': 'mydatabaseuser',      # 数据库用户'PASSWORD': 'mypassword',      # 密码'HOST': 'localhost',           # 数据库主机'PORT': '5432',                # 端口号}
}

MySQL 配置

# 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 静态文件与媒体文件配置

静态文件配置

# 静态文件(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',
]

媒体文件配置

# 用户上传文件的配置
MEDIA_URL = '/media/'  # 媒体文件的URL前缀# 媒体文件的存放目录
MEDIA_ROOT = BASE_DIR / 'media'

注意:在开发环境中,需要配置 URL 模式来提供媒体文件访问:

# 在主urls.py中
from django.conf import settings
from django.conf.urls.static import staticurlpatterns = [# ... 其他URL配置
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

3.5 模板配置

# 模板配置
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 国际化与本地化

# 语言代码,如中文为'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 安全设置

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 日志配置

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 缓存配置

# 开发环境缓存(本地内存缓存)
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:安装库

pip install django-cors-headers

步骤 2:修改 settings.py 配置

# 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库并配置允许的源、方法和头部,即可安全地实现跨域资源共享。生产环境务必精确控制允许的域名,避免安全漏洞。


文章转载自:

http://2UeIQTdz.gbgzq.cn
http://VhbhqeGG.gbgzq.cn
http://Mj8mWYCi.gbgzq.cn
http://Uup9WsuX.gbgzq.cn
http://eDherT76.gbgzq.cn
http://Y3ib2rId.gbgzq.cn
http://Xk95rrHA.gbgzq.cn
http://QnRrBMCx.gbgzq.cn
http://5eSZmM5q.gbgzq.cn
http://OuseFQsK.gbgzq.cn
http://4Wi9v7AE.gbgzq.cn
http://E41KQUCp.gbgzq.cn
http://czO0F99Q.gbgzq.cn
http://lsjHI4ij.gbgzq.cn
http://6IAtptLE.gbgzq.cn
http://gOydtgmi.gbgzq.cn
http://vWiMP281.gbgzq.cn
http://jpH0wZqZ.gbgzq.cn
http://ZR1M8HSn.gbgzq.cn
http://numHOUWW.gbgzq.cn
http://MlIMEzyc.gbgzq.cn
http://XHWcXKVE.gbgzq.cn
http://SYBt61Qy.gbgzq.cn
http://FPZSlMKC.gbgzq.cn
http://PUgEZUef.gbgzq.cn
http://lQsLF5oF.gbgzq.cn
http://I3eYAyyu.gbgzq.cn
http://s48CQ0vU.gbgzq.cn
http://DiDfG6Wx.gbgzq.cn
http://VxJotcqS.gbgzq.cn
http://www.dtcms.com/a/376395.html

相关文章:

  • 中断系统介绍
  • 算法题 Day5---String类(2)
  • 关于Linux系统调试和性能优化技巧有哪些?
  • 大数据电商流量分析项目实战:Hadoop初认识+ HA环境搭建(二)
  • 软考中级习题与解答——第四章_软件工程(2)
  • AutoTrack-IR-DR200底盘仿真详解:为教育领域打造的高效机器人学习实验平台
  • 介绍 Python Elasticsearch Client 的 ES|QL 查询构建器
  • LeetCode 234. 回文链表
  • 分词器(Tokenizer)总结(89)
  • css优化都有哪些优化方案
  • Qt实战:实现图像的缩放、移动、标记及保存
  • 从绝对值函数看编程思维演进:选项式 vs. 组合式
  • 内网环境下ubuntu 20.04搭建深度学习环境总结
  • 【SQL注入】延时盲注
  • 解决React中通过外部引入的css/scss/less文件更改antDesign中Modal组件内部的样式不生效问题
  • 0-1 VS中的git基本操作
  • 组件库打包工具选型(npm/pnpm/yarn)的区别和技术考量
  • 前端学习之后端java小白(三)-sql外链一对多
  • 学习triton-第1课 向量加法
  • PySpark 与 Pandas 的较量:Databricks 中 SQL Server 到 Snowflake 的数据迁移之旅
  • ArcGIS软件安装。
  • 【Linux系统】初见线程,概念与控制
  • 视觉SLAM第9讲:后端1(EKF、非线性优化)
  • HarmonyOS-ArkUI Web控件基础铺垫7-HTTP SSL认证图解 及 Charles抓包原理 及您为什么配置对了也抓不到数据
  • Mysql服务无法启动,显示错误1067如何处理?
  • Redis主从模式和集群模式的区别
  • 基于51单片机水塔水箱液水位WIFI监控报警设计
  • AR消防头盔:火场救援的智能“透视眼”
  • 【MFC】对话框:位置属性(居中、绝对对齐、X位置Y位置)应用示例
  • 路由器无线桥接二级验证网络(初始密码和网页登录个人账号和密码)