Django项目配置全攻略:settings配置文件

文章目录

一、settings 配置文件介绍

settings.py 是 Django 项目的核心配置文件,存放数据库、静态文件、中间件等关键参数。

python 复制代码
# 上线时为False,调试时为True(浏览页面发生错误,会告诉你那里错了)
DEBUG = True

# 语言  英文:en-us   中文:zh-Hans
LANGUAGE_CODE = 'zh-Hans'
# 时区  UTC   Asia/Shanghai
TIME_ZONE = 'Asia/Shanghai'

# 用户上传文件的配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

二、数据库配置(mysql、redis)

mysql配置

如果本地建立了数据库,且使用本地的 MySql 数据库,则可以通过修改settings.py中的配置来连接

python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOET': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123456',
        'NAME': 'meiduo_mall',
    }
}

同时需要在settings.py同级目录下的__init__.py文件添加如下内容(需提前安装pip install pymysql

作用 :将 PyMySQL 适配为 Django 默认使用的 MySQL 驱动接口。Django 默认使用 MySQLdb 作为 MySQL 数据库驱动,但 MySQLdb 仅支持 Python 2 或需要额外编译。PyMySQL 是一个纯 Python 实现的 MySQL 客户端,兼容 Python 3,通过此方法可以让 Django 将其识别为合法的 MySQL 驱动

使用场景:当系统未安装 MySQLdb 或运行在 Python 3 环境下时,需使用 PyMySQL 作为替代;

python 复制代码
import pymysql
pymysql.install_as_MySQLdb()

redis配置

Redis在Django中主要用于缓存、会话存储、消息队列等场景,能够显著提升应用性能

缓存加速 :Redis作为高速缓存存储查询结果、页面片段或API响应,减少数据库查询压力,适合高频访问但更新不频繁的数据

会话管理 :将会话数据(Session)存储在Redis中,解决多服务器环境下会话共享问题,比数据库存储更快且支持过期时间

消息队列 :通过Redis的发布订阅(Pub/Sub)或List结构实现异步任务队列,配合Celery处理耗时任务如邮件发送、文件处理等

频率限制 :存储用户请求计数,实现API限流或防止暴力破解,例如登录尝试次数限制

实时功能:支持实时通知、在线状态等场景,利用Redis的快速读写特性推送数据变更
准备工作 :确保已安装Redis服务端并启动服务。若未安装,可从Redis官网下载并运行
安装依赖pip install redis django-redis

settings.py文件中添加Redis相关配置

python 复制代码
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",  # 数据库编号1
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": "yourpassword",  # 如果有密码
        }
    }
}

# 可选:将Session存储改为Redis
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

使用缓存示例

python 复制代码
from django.core.cache import cache

# 设置缓存(有效期60秒)
cache.set('key', 'value', timeout=60)

# 获取缓存
data = cache.get('key')

三、配置日志

settings.py 中配置日志系统,Django 使用 Python 标准库 logging 模块

python 复制代码
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,   # 是否禁用以及存在的日志器
    'formatters': {                      # 日志信息显示格式
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {                  # 对日志进行过滤
        'require_debug_true': {   # django在debug模式下才输出日志
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {        # 日志处理方式
        'console': {     # 向终端输出日志
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {                # 向文件中输出日志
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_DIR, 'logs/log.log'), # 日志文件的位置
            'maxBytes': 300*1024*1024,
            'backupCount': 10,
            'formatter': 'verbose'
        },
    },
    'loggers': {                              # 日志器
        'django': {                           # 定义一个名为django的日志器
            'handlers': ['console', 'file'],  # 可以同时向终端与文件中输出日志
            'propagate': True,                # 是否继续传递日志信息
            'level': 'INFO',                  # 日志接收的最低日志级别
        },
    }
}
日志级别 含义
DEBUG 调试信息,适用于开发环境
INFO 常规操作记录
WARNING 警告信息,不影响系统运行
ERROR 错误信息,影响部分功能
CRITICAL 严重错误,可能导致系统崩溃

在视图或任何 Python 模块中调用日志

python 复制代码
import logging

logger = logging.getLogger(__name__)

def my_view(request):
    logger.debug('This is a debug message')
    logger.info('This is an info message')
    logger.warning('This is a warning message')
    logger.error('This is an error message')
    logger.critical('This is a critical message')

日志文件轮转配置:使用 RotatingFileHandler 实现日志按文件大小自动分割日志,避免单个日志文件过大

python 复制代码
'handlers': {
    'file': {
        'level': 'DEBUG',
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': '/path/to/django.log',
        'maxBytes': 1024*1024*5,  # 5MB
        'backupCount': 5,
        'formatter': 'verbose',
    },
}

按时间分割日志文件

python 复制代码
'handlers': {
    'file': {
        'level': 'DEBUG',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'filename': '/path/to/django.log',
        'when': 'midnight',  # 每天午夜
        'interval': 1,
        'backupCount': 7,  # 保留7天
        'formatter': 'verbose',
    },
}

日志过滤器配置:添加自定义过滤器

python 复制代码
'filters': {
    'require_debug_true': {
        '()': 'django.utils.log.RequireDebugTrue',
    },
},
'handlers': {
    'console': {
        'level': 'DEBUG',
        'filters': ['require_debug_true'],
        'class': 'logging.StreamHandler',
    },
}

数据库日志记录:将日志存入数据库需要自定义处理器

python 复制代码
class DatabaseLogHandler(logging.Handler):
    def emit(self, record):
        from .models import ErrorLog
        ErrorLog.objects.create(
            level=record.levelname,
            message=record.getMessage(),
            module=record.module,
            lineno=record.lineno
        )

LOGGING = {
    'handlers': {
        'db': {
            'level': 'ERROR',
            'class': 'myapp.logging_handlers.DatabaseLogHandler',
        },
    }
}

四、域名配置

linux系统修改文件/etc/hosts,添加内容 127.0.0.1 www.xxx.site

Windows系统修改文件C:\Windows\systems32\drivers\etc\hosts,添加内容 127.0.0.1 www.xxx.site
修改settings.py文件

python 复制代码
ALLOWED_HOSTS = ['127.0.0.1', 'www.xxx.site']

然后在网页访问www.xxx.site就是访问127.0.0.1

五、自定义用户模型

在 Django 中,AUTH_USER_MODEL 是一个关键配置项,用于指定项目中使用的自定义用户模型。它决定了用户认证系统的基础模型类,取代 Django 默认的 User 模型
核心功能

自定义用户模型 :允许开发者扩展或完全替换 Django 默认的 User 模型(django.contrib.auth.models.User)。例如,可以添加字段如 phone_number 或修改认证逻辑(如改用邮箱登录)

数据库表关联 :所有与用户关联的外键(如 ForeignKey、OneToOneField)会自动引用 AUTH_USER_MODEL 指定的模型,确保数据一致性

认证系统集成:Django 的权限系统(Permission)、组(Group)和内置视图(如 LoginView)均基于此配置运行
配置方法 :在 settings.py 中定义

python 复制代码
#通过提供一个值给AUTH USER MODEL设置,
# 指向自定义的模型,Django允许你覆盖默认的User模型
# AUTH_USER_MODEL = '子应用名.模型名'
AUTH_USER_MODEL = 'users.User'

:必须在首次迁移(makemigrations)前设置,否则需重建数据库
模型定义:自定义模型需继承 AbstractUser 或 AbstractBaseUser

python 复制代码
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=20)

外键引用方式:在模型中引用用户时,应使用 settings.AUTH_USER_MODEL 而非直接导入

python 复制代码
from django.conf import settings

class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

导入限制:避免直接导入 User 模型,否则可能导致循环导入或模型冲突。需通过 get_user_model() 动态获取

python 复制代码
from django.contrib.auth import get_user_model
User = get_user_model()

六、定时任务(性能优化)

django-crontab 是一个基于 Linux 系统 crontab 的 Django 定时任务扩展,允许通过 Django 配置管理周期性任务,无需直接操作系统的 crontab 文件。它简化了定时任务的创建、更新和删除流程

应用场景

利用好定时任务,可以有效的提升项目的性能

页面静态化 :当页面中涉及一些数据库查询操作时,可以利用定时任务,定期查询一次数据库,将生成一份经过数据渲染后的静态html文件,后期请求直接返回该静态文件,有效减少数据库查询操作

定时更新redis:页面涉及数据时,可以利用定时任务,将数据定时更新保存到redis中,后端返回时,从redis中读取数据,相比数据库,redis的读写速度更快
安装依赖pip install django-crontab

配置步骤

  1. 添加到 INSTALLED_APPS
    在 Django 项目的 settings.py 文件中添加 django_crontab 到 INSTALLED_APPS
python 复制代码
INSTALLED_APPS = [
    ...,
    'django_crontab',
]
  1. 配置定时任务
    settings.py 中定义 CRONJOBS 列表,指定任务频率和执行的函数路径。
python 复制代码
CRONJOBS = [
    # 参数1: 频次 (每1分钟生成一次首页静态文件)  分 时 日 月 周
    # 参数2: 任务(函数)
    # 参数3: 日志
    ('*/5 * * * *', 'myapp.cron.my_scheduled_job', '>> /tmp/my_job.log'),
    # 支持传递参数和自定义环境变量
    ('0 1 * * *', 'myapp.cron.daily_backup', ['arg1', 'arg2'], {'DJANGO_ENV': 'production'}),
]
  1. 编写任务函数
    在应用目录下创建 cron.py 文件,定义任务函数
python 复制代码
def my_scheduled_job():
    print("This task runs every 5 minutes")

管理定时任务

添加任务到系统 crontabpython manage.py crontab add

查看已激活的任务列表python manage.py crontab show

移除所有任务python manage.py crontab remove

七、Celery 异步与定时任务

Celery 是 Python 生态中广泛使用的分布式任务队列,专注于实时处理与任务调度,支持异步任务和定时任务。它与 Django 深度集成,常用于处理耗时操作(如邮件发送、文件处理)或定时任务(如数据备份)

核心概念

Broker :Celery 通过消息代理(如 RabbitMQ、Redis)传递任务。Redis 是最常见的选择,因其简单且支持持久化

Worker :执行任务的进程

Result Backend:存储任务结果(如 Django 数据库、Redis)

安装与基础配置

安装依赖包 :安装 Celery 和与 Django 集成的库

pip install celery django-celery-results django-celery-beat
项目结构配置:在Django项目的settings.py同目录下创建celery.py文件

python 复制代码
from __future__ import absolute_import
from celery import Celery
import os
from django.conf import settings

# 让celery加载当前工程中的配置文件  注意 projectname 名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectname.settings')
# 给celery的实例起个名字,这个名字唯一就可以
app = Celery('project')
# config_from_object 参数: 就是 配置文件的路径
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

在__init__.py中初始化Celery,确保 Celery 应用在 Django 启动时加载

python 复制代码
from .celery import app as celery_app
__all__ = ('celery_app',)

配置 settings.py,添加 Celery 相关配置

python 复制代码
# Broker 配置(以 Redis 为例)
CELERY_BROKER_URL = 'redis://localhost:6379/0'
# 结果后端
CELERY_RESULT_BACKEND = 'django-db'
# 定时任务配置
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'

异步任务配置

验证码举例:以获取验证码后,将验证法发送短信到客户端为例,发短信是耗时的,如果短信被阻塞,用户响应将会延迟。响应延迟会照成用户界面倒计时延迟
编写异步任务:在 Django 的某个子应用中创建 tasks.py,使用 @app.task 装饰器定义异步任务

python 复制代码
from celery import shared_task

@shared_task
def send_email(user_id):
    from django.core.mail import send_mail
    # 模拟耗时操作
    send_mail('Subject', 'Message', 'from@example.com', ['to@example.com'])

启动 Celery Worker (需要额外启动该服务):celery -A project worker --loglevel=info
视图调用异步任务:在 Django 视图中调用任务,使用 .delay() 方法触发异步执行

python 复制代码
from .tasks import send_email

def my_view(request):
    send_email.delay(request.user.id)  # 异步执行
    # 执行return时,上面的任务还没结束,只是提交到了消息队列中
    # 如果要等任务结束再执行return,可使用get
    # result = send_email.delay(request.user.id).get(timeout=10)  # 同步等待10秒
    return HttpResponse("Task started!")

定时任务配置

通过 Celery Beat 实现定时任务。在 settings.py 中配置

python 复制代码
from celery.schedules import crontab

CELERY_BEAT_SCHEDULE = {
    'send-daily-report': {
        'task': 'app.tasks.send_daily_report',
        'schedule': crontab(hour=8, minute=0),  # 每天 8 点执行
    },
}

定义定时任务函数:在 tasks.py 中编写任务逻辑

python 复制代码
@shared_task
def backup_database():
    import subprocess
    subprocess.run(["pg_dump", "-h", "localhost", "-U", "user", "dbname"])

启动 Beat 服务celery -A project beat --loglevel=info

常见问题与优化

任务重试:使用 @app.task(bind=True, retry_backoff=True) 实现自动重试

python 复制代码
'''
@shared_task(
    max_retries=5,           # 最大重试次数
    default_retry_delay=60,  # 每次重试之间的延迟时间
    autoretry_for=(Exception,),  # 自动重试的异常类型
    retry_backoff=True,      # 启用指数退避策略,延迟时间会随着重试次数增加而指数级增长。值为 True 或一个整数(表示初始延迟秒数)
    retry_backoff_max=600,   # 设置指数退避的最大延迟时间(秒)。避免因退避策略导致延迟时间过长
    retry_jitter=True        # 在退避延迟时间中添加随机性,避免多个任务同时重试导致资源竞争。值为 True 或 False
)
'''
@shared_task(bind=True, retry_backoff=True)
def flaky_task(self):
    try:
        # 可能失败的操作
    except Exception as e:
        raise self.retry(exc=e, countdown=60) # 手动触发重试 60秒后重试

任务结果查询:通过 AsyncResult 查询任务状态

python 复制代码
from celery.result import AsyncResult
result = AsyncResult(task_id)
print(result.status)  # PENDING, SUCCESS, FAILURE

性能优化 :通过 -c 参数调整 Worker 并发数(如4并发:celery -A project worker -c 4

相关推荐
for_ever_love__2 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习
AC赳赳老秦2 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
麻雀飞吧3 小时前
零基础选量化工具,先把问题说清楚
人工智能·python
段一凡-华北理工大学4 小时前
AI推动工业智能化转型~系列文章20:工业 AI 平台架构:云-边-端协同的技术体系
人工智能·python·架构·工业平台·云-边协同
IT_陈寒4 小时前
Python线程池吞了异常还不告诉我,这谁顶得住啊
前端·人工智能·后端
CodeBlog-star4 小时前
Harness Engineering:Pi Agent 架构深度解析
人工智能·python·架构·harness工程
简不变4 小时前
将components下的文件夹复制到别一个文件夹下,并重新生成CMakelist.txt文件
python
小强库计算机毕业设计4 小时前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
小狼1834 小时前
实践6|SDD 实战:AI 写的规格被推翻了四次
后端·claude