线上环境如何正确配置 Django 的 DEBUG?

2023-12-20

django-ide

Author: rab

Django Version:3.2

Python Version:3.9



前言

由于最近在学习 Django 的知识,于是尝试开发了一套 Blog 系统,在本地测试时是页面显示没问题,到线上部署时我修改了 Django 工程的 settings 配置文件的 DEBUG 调试为 False,结果浏览器运行时产生了如下图页面异常加载的情况。

image-20231219121626530

实际上在 Django 中, DEBUG 设置为 True False 时是会影响应用程序行为的。

接下来我们来看看这 DEBUG = False DEBUG = True 的区别。

一、DEBUG = True

image-20231219123026341

在开发环境中通常会将 DEBUG 设置为 True 。当 DEBUG True 时,Django 会提供详细的错误页面,包含堆栈跟踪、请求信息等,以帮助开发者诊断和调试问题。

还有就是,该模式下 Django 会 自动重新加载 ,即 Django 会监视代码的更改,并在检测到更改时自动重新加载应用程序,以便开发者能够立即看到对代码的更改。

除了会进行自动重新加载,还提供了 静态文件服务 ,即 Django 会自动为开发服务器提供静态文件,包括 CSS、JavaScript 等。

二、DEBUG = False

image-20231219122910478

在生产环境中通常会将 DEBUG 设置为 False 。在生产中,开启调试模式会导致 安全风险 ,因为它会暴露敏感信息和提供潜在攻击点。

此时该模式下,当发生错误时,Django 不会显示详细的错误页面给用户,而是显示一个通用的服务器错误页面。这有助于保护敏感信息,但也意味着开发者不会直接看到错误的详细信息。

那该模式下是否提供 静态文件服务 呢?在生产环境中(即 DEBUG = False ),Django 不会自动为你提供静态文件。通常,你需要通过 Web 服务器(如 Nginx 或 Apache)来提供这些文件,或者使用专门的静态文件服务工具(如 WhiteNoise)来提供静态文件服务。

这也是为什么我线上页面显示异常的原因,因为此时的页面无法加载到 js 资源,导致页面显示异常,那如何解决掉这个异常呢?接下来继续看 “页面异常解决” 部分。

三、页面异常解决

页面异常的主要原因就是 DEBUG = True django].contrib.staticfiles 会自动帮助寻找静态路径。而 DEBUG = False 时, django.contrib.staticfiles 就失效了,需要我们自己设置静态路径。

解决方案如下:

1、修改 settings 配置文件

注释掉原来的 STATICFILES_DIRS ,并新增 STATIC_ROOT

STATIC_URL = 'static/'
#STATICFILES_DIRS = [
#    os.path.join(BASE_DIR, 'static'),
#]
STATIC_ROOT = os.path.join(BASE_DIR, "static")

如果不注释,可能会产生如下的报错信息:

image-20231219135121414

2、修改 blog/urls.py

from django.contrib import admin
from django.urls import path, include, re_path
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    # include 的参数中,我们首先设置一个元组(urlconf_module, app_name)
    # urlconf_module:子应用的路由
    # app_name:子应用的名字
    path('', include(('users.urls', 'users'), namespace='users')),
    # path('', log)
    path('', include(('home.urls', 'home'), namespace='home')),
    # 静态资源配置
    re_path(r"^static/(?P<path>.*)$", static.serve, {"document_root": settings.STATIC_ROOT}, name='static'),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

image-20231219132919024

这个错误通常是由于在 Django 的 urls.py 文件中使用了 static.serve 而引起的。在 Django 3.1 及以上的版本中, static.serve 已经被移除,因此会导致这个错误。

解决这个问题的方法是使用 django.contrib.staticfiles.views.serve 来替代 static.serve 。以下是修改后的代码:

from django.contrib import admin
from django.urls import path, include, re_path
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.views import serve

urlpatterns = [
    path('admin/', admin.site.urls),
    # include 的参数中,我们首先设置一个元组(urlconf_module, app_name)
    # urlconf_module:子应用的路由
    # app_name:子应用的名字
    path('', include(('users.urls', 'users'), namespace='users')),
    # path('', log)
    path('', include(('home.urls', 'home'), namespace='home')),
    # 静态资源配置(需导入re_path、serve模块)
    re_path(r"^static/(?P<path>.*)$", serve, {"document_root": settings.STATIC_ROOT}, name='static'),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

3、收集静态文件

python manage.py collectstatic

# 在 Django 应用中,静态文件通常包括 CSS 样式表、JavaScript 脚本、图像文件等,它们用于美化和增强用户界面。
# 在开发阶段,Django 的开发服务器会自动为你提供这些静态文件,但在生产环境中,你需要集中收集并处理这些文件,以便它们能够被 Web 服务器正确地提供。
# 命令会查找所有已安装的应用程序中的静态文件,并将其复制到一个指定的目录(通常是 STATIC_ROOT 设置的目录)。

4、Nginx 配置静态资源

为什么要配置?因为你的客户是通过外网(https://blog.rabcnops.cn)来访问你的博客的,而在静态资源加载时,会是这样的请求链接 https://blog.rabcnops.cn/static/md_css/monokai.css ,如果你 Nginx 不配置这些静态资源,那服务器肯定返回 404 错误码,因此我们需要通过 Nginx 或其他静态资源服务器指定本次 Djangon 用到的所有静态资源路径,这样才能正常请求。

  • CSS、JS 等资源

    也就是说当我们 url 为 static 时将其引导到 alias 所指定的路径下

    ...
    location /static {
            alias /data/project/blog/static;
    }
    ...
    
  • 图片、视频等媒体文件

    ..
    location /static {
            alias /data/project/blog/static;
    }
    ...
    

5、验证

  • 首页展示

    image-20231219230600435

  • 后台登录页

    image-20231219230442333

总结

DEBUG 设置为 True 是为了方便开发和调试,而 DEBUG 设置为 False 是为了提高生产环境的安全性和性能。 在生产环境中,绝对不应该将 DEBUG 设置为 True ,因为它可能导致严重的安全问题。

当你 DJango 服务配置完成后,同时还应该注意在 Nginx 等 Web 服务器配置静态资源,否则无法请求到。

—END

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线上环境如何正确配置 Django 的 DEBUG? 的相关文章

随机推荐

  • 收单外包服务机构的评级工作已经开始了!

    评级收单外包服务机构的工作不仅是金融监管部门规范和引导收单外包服务市场的重要举措 也影响着外包机构的业务发展 并且是每年最重要的合规工作之一 中国支付清算协会于2023年12月18日发布了一份关于进行2023年度收单外包服务机构评级工作的通
  • python之pyQt5实例:鼠标创建点

    实现一个基于PyQt5的画布 可以通过鼠标左键点击的方式创建点 并在画布中显示出来 from PyQt5 QtWidgets import QApplication QWidget QMainWindow QInputDialog from
  • yolov5障碍物识别-雪糕筒识别(代码+教程)

    简介 这是一个检测交通锥并识别颜色的项目 我使用 yolov5 来训练和检测视锥细胞 此外 我使用 k 均值来确定主色 以对锥体颜色进行分类 目前 支持的颜色为红色 黄色 绿色和蓝色 其他颜色被归类为未知 数据集和注释 我使用了一个自收集的
  • 软件测试/测试开发|如何在Ubuntu系统中安装docker

    Docker是一种流行的容器化平台 它能够简化应用程序的部署和管理 本文将介绍在Ubuntu操作系统上安装Docker的步骤 以便我们可以开始使用Docker来构建和运行容器化应用程序 系统版本 本文以Ubuntu20 05系统为例安装do
  • C语言—每日选择题—Day55

    第一题 1 若有如下定义 则 p1 m p2 p1 是正确赋值语句 说法是否正确 int p1 int p2 int m 5 int n A 正确 B 错误 答案及解析 A 本题考查的是对类型的认识 p1是指针类型 赋值的右操作数就必须是地
  • 自然语言处理初学者指南(附1000页的PPT讲解)

    自然语言处理是计算机科学领域和人工智能领域的重要研究方向之一 旨在探索实现人与计算机之间用自然语言进行有效交流的理论与方法 它融合了语言学 计算机科学 机器学习 数学 认知心理学等多学科内容 涉及从字 词 短语到句子 段落 篇章的多种语言单
  • nodejs微信小程序+python+PHP的大学生社会实践申报系统-计算机毕业设计推荐

    系统主要包括首页 个人中心 项目分类管理 学生管理 教师管理 学生活动申报管理 社会实践活动管理 活动报名申请管理 系统管理等功能模块 根据需求分析制定模块并设计数据库结构 大学生社会实践申报系统的需求和管理上的不断提升 大学生社会实践申报
  • nodejs+vue+微信小程序+python+PHP协同过滤算法的电影推荐系统-计算机毕业设计推荐python

    信息数据的处理完全依赖人工进行操作 会耗费大量的人工成本 特别是面对大量的数据信息时 传统人工操作不仅不能对数据的出错率进行保证 所以电子化信息管理的出现就能缓解以及改变传统人工方式面临的处境 一方面可以确保信息数据在短时间被高效处理 还能
  • 学术编辑青睐《乡村振兴战略下传统村落文化旅游设计》期货刊印辉少许

    学术编辑青睐 乡村振兴战略下传统村落文化旅游设计 期货刊印辉少许 学术编辑青睐 乡村振兴战略下传统村落文化旅游设计 期货刊印辉少许
  • 力扣面试题 16.19. 水域大小(java DFS解法)

    Problem 面试题 16 19 水域大小 文章目录 题目描述 思路 解题方法 复杂度 Code 题目描述 思路 该问题可以归纳为一类 遍历二维矩阵 的题目 此类中的一部分题目可以利用 DFS 来解决 具体到本题目 该题目可以的写法大体不
  • Java 基础学习(十四)Map集合与Set集合

    1 Map集合 1 1 Map接口 1 1 1 Map接口概述 Map接口是一种双列集合 Map的每个元素都包含一个键对象Key和一个值对象Value 键对象和值对象之间存在对应关系 这种关系称为映射 Mapping Map接口中的元素 可
  • Android 12.0 Launcher3定制化之动态日历图标功能实现

    1 概述 在12 0的系统产品rom开发中 在Launcher3中的相关定制化功能中 对于一些产品要求需要动态日历图标功能 在日期改变的时候 日历图标也需要跟着改变 所以需要自定义日历图标 监听日历改变的广播 收到日期改变的广播后 刷新日历
  • 计算机网络 网络层下 | IPv6 路由选择协议,P多播,虚拟专用网络VPN,MPLS多协议标签

    文章目录 5 IPv6 5 1 组成 5 2 IPv6地址 5 3 从IPv4向IPv6过渡 5 3 1 双协议栈 5 3 2 隧道技术 6 因特网的
  • 每天都很煎熬,领导派的活太难,真的想跑路了

    每天都很煎熬 领导派的活太难 真的想跑路了 人在江湖身不由己 无论是领导的亲信还是团队的边缘 都可能遇到这种情况 不得不干一件特别难以推进的事情 茫然无措 不知如何推进 每天陷入焦虑和自我怀疑中 这种事情一般有一些共同特点 结果和目标极其模
  • 创建个人网站(二)前端主页设计和编写一(太阳移动)

    前言 以下内容纯纯当乐子来看就行 知识分享一下这样设计的原因 想看正文直接见下一节 为什么创建个人网站一之后几天没有动静了呢 一个是家里有事实在比较忙 第二个原因是没想到主页要设计成什么样 知道前两天问我姐什么样的主页比较炫酷 我们得出的结
  • 网工内推 | 美团、中通快递,网络运维,最高30K*15薪

    01 美团 招聘岗位 网络运维开发工程师 职责描述 1 负责新零售业务门店 仓库网络的日常运维 故障处理 应急响应 保障网络及相关业务的稳定运行 处理突发事件 对疑难问题进行跟踪并最终解决 2 负责新零售业务门店 仓库网络的建设和运维 对涉
  • 软件测试/测试开发|Ubuntu系统常用文件管理命令详解

    前言 Ubuntu是一种广泛使用的Linux操作系统 提供了丰富而强大的文件管理命令 使用户能够通过命令行轻松管理文件和目录 本文将介绍一些常用的Ubuntu文件管理命令 帮助用户更好地理解和利用系统资源 ls 列出目录内容 ls 选项 目
  • vue-springboot美食菜谱分享平台in9c2

    1 以人为本原则 这个厨房达人美食分享平台 它的本质是为人们服务 是希望其可以实现并满足广大使用者对科技时代下的厨房达人美食分享平台的憧憬与向往 如何解放需要人工才能完成的部分和提升使用者的使用观感是最为基础的也是最重要的 它的设计宗旨就是
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • 线上环境如何正确配置 Django 的 DEBUG?

    Author rab Django Version 3 2 Python Version 3 9 目录 前言 一 DEBUG True 二 DEBUG False 三 页面异常解决 总结