文章目录
- [一、settings 配置文件介绍](#一、settings 配置文件介绍)
- 二、数据库配置(mysql、redis)
- 三、配置日志
- 四、域名配置
- 五、自定义用户模型
- 六、定时任务(性能优化)
-
- [七、Celery 异步与定时任务](#七、Celery 异步与定时任务)
一、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.siteWindows系统修改文件
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
配置步骤
- 添加到 INSTALLED_APPS 。
在 Django 项目的 settings.py 文件中添加 django_crontab 到 INSTALLED_APPS
python
INSTALLED_APPS = [
...,
'django_crontab',
]
- 配置定时任务 。
在 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'}),
]
- 编写任务函数 。
在应用目录下创建 cron.py 文件,定义任务函数
python
def my_scheduled_job():
print("This task runs every 5 minutes")
管理定时任务
添加任务到系统 crontab :
python 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)