首页 > 编程问答 >如果不重新启动 django,上传的媒体不会在生产模式下运行

如果不重新启动 django,上传的媒体不会在生产模式下运行

时间:2024-07-22 13:53:49浏览次数:7  
标签:python django webserver django-media whitenoise

我需要在生产模式下在 Django 中提供媒体服务,并且很少需要在 Django 管理中提供电报用户照片。所以我知道关于 Django 的一切,它不是为了提供文件或媒体,所以没有必要重复重复的事情。我只需要在生产模式下为我的目的提供媒体服务,因此我使用 WhiteNoise 来执行此操作并附加以下行:

MIDDLEWARE = [
...
    'whitenoise.middleware.WhiteNoiseMiddleware',
...
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'medias')

in urls.py:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('botAPI.urls')),
]

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATICFILES_DIRS[0])
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
else:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

in wsgi.py 我把这个:

...
application = get_wsgi_application()
application = WhiteNoise(application, root=MEDIA_ROOT, prefix='/media/')
....

它工作正常并且在生产模式下提供媒体文件。但对于新媒体,例如在 Django 管理中上传图像,我必须重新启动 Django 才能访问该媒体。有什么方法可以解决这个问题,或者 Django 中有其他方法可以动态地提供媒体文件吗? (我不能使用任何外部服务云或 CDN 或网络服务器)一切都应该与运行 Django 一起使用


你遇到的问题是,当你运行生产环境时,WhiteNoise 并不知道新的媒体文件,因为它只服务于静态文件。 虽然你将 WhiteNoise 配置为服务于媒体文件,但这不是一个理想的解决方案。

以下是如何在不重新启动 Django 的情况下在生产环境中服务媒体文件并解决此问题:

1. 使用 Django 的开发服务器服务媒体文件(仅用于开发)

在你的 settings.py 文件中,当 DEBUG 模式被启用时,配置 Django 来服务媒体文件。 这对于开发来说是合适的,但对于生产环境来说不推荐。

```python from django.conf import settings from django.conf.urls.static import static

if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ```

2. 在生产环境中使用专门的 Web 服务器(推荐)

对于生产环境,最佳实践是使用像 Nginx 或 Apache 这样的 Web 服务器来服务媒体文件。 这种方法提供了更好的性能和安全性。 以下是如何使用 Nginx 进行配置:

  • 配置 Nginx: 在你的 Nginx 站点配置中,添加一个 location 块来处理媒体文件请求。 这将直接从你的 MEDIA_ROOT 目录提供媒体文件。

nginx location /media/ { alias /path/to/your/project/medias/; # 替换为你的实际路径 }

  • 收集静态文件: 在部署 Django 项目之前,请确保使用 collectstatic 命令收集所有静态文件,包括媒体文件,到你的 STATIC_ROOT 目录:

bash python manage.py collectstatic

  • 重新加载 Nginx: 配置 Nginx 后,重新加载或重启它以应用更改。

3. 使用云存储服务

另一个选择是将你的媒体文件存储在像 Amazon S3、Google Cloud Storage 或 Azure Blob Storage 这样的云存储服务中。 这种方法提供了可扩展性、可靠性和性能优势。 Django 存储后端,如 django-storages ,可以轻松地与这些服务集成。

重要提示:

  • 永远不要在生产环境中使用 Django 的开发服务器。 它没有针对安全性和性能进行优化。
  • 如果你选择使用专门的 Web 服务器,请确保它配置为正确处理媒体文件,并且 Django 不会尝试自己提供它们。

通过遵循这些步骤,你可以在不依赖于重新启动 Django 的情况下,在生产环境中有效且安全地服务媒体文件。

标签:python,django,webserver,django-media,whitenoise
From: 78777074

相关文章

  • django 数据库迁移结束之后,就执行的代码
    在你需要的app下面创建signals.py文件该文件下写出你需要执行的函数或类例如fromdjango.dbimporttransactionfromuserimportmodelsfromloggerimportlogclassCreatePermissions(object):@staticmethoddefcreate_permissions(sender,**kwargs):......
  • Python:提交和跟踪许多子流程会导致“卡住”子流程
    我有一个第3方cli可执行文件,需要从python代码中调用。这些都是繁重的计算(CPU),我需要调用它大约50-100次。可执行文件本身在某种程度上是多线程的,但不是所有步骤,而且我有很多可用的核心。这意味着我希望同时运行多个子进程,但不是全部。因此,我需要提交其中一些,然后跟踪......
  • 无法在 Ubuntu 20.04 中安装 python3-venv,一些损坏的软件包
    这可能很长,但请耐心看完当我在关注这篇文章时尝试安装python3-venvsudoaptinstallbuild-essentiallibssl-devlibffi-devpython3-dev它抛出了以下错误:libffi-devpython3-devReadingpackagelists...DoneBuildingdependencytreeRead......
  • 正则表达式在python爬虫中常用的方法举例
    在爬虫中,正则表达式被广泛用于从网页中提取特定信息。以下是一些常用的正则表达式方法举例,以及它们在爬虫中的典型应用场景:1.提取URLimportreurl_pattern=r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'urls=re.findall(url_pattern,html_content)用于从网页中......
  • 使用 Python XlsxWriter 将 DatePicker 添加到 Excel 单元格中?
    我正在尝试使用PythonXlsxWriter生成的Excel创建输入表单。我想知道是否可以在Excel单元格中添加一个迷你日历(作为DatePicker)供用户输入日期?我偶然发现了Microsoft支持团队提供的本指南插入日期选择器:|||https://support.microsoft.com/en-us/office/......
  • [1037] Python operation of three keys shortcut (pynput)
    Theshortcutof win+shift+leftdoesnotworkwellin pyautogui,butitworkswellin pynput.MovingtheActiveWindowtoaDifferentMonitor: You’reright;PyAutoGUIdoesn’tdirectlysupportmovingwindowsacrossmonitorswiththeeleganceofaswan......
  • 在我将迁移应用于翻译后,我遇到了 django-parler 2.0.1 的问题,它不会在管理站点中显示
    这是我在models.py文件中的翻译设置,在我进行同步迁移后,django-parler2.0.1将不会在管理站点中显示产品字段。我目前使用的是Django3.0.3。fromdjango.dbimportmodelsfromdjango.urlsimportreversefromparler.modelsimportTranslatableModel,Translate......
  • Python:定期检测断开故障的USB设备并重新初始化实例
    我有一个USB设备,有时会通过USB端口发送串行数据。问题是设备出现故障,有时会无缘无故地断开连接并再次连接到电脑。问题不大,但在这些情况下我需要重新初始化serial.Serial(port)实例,这有点烦人。该设备没有可以从我那里收到的任何命令,我可以验证它是否已连接。我可以......
  • 【校招+社招】华为OD机试 - 拼接URL(Java、JavaScript、Python、C、C++)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)算法概述URL拼接(URL拼接)是指将多个URL组件(方案、主机、端口、路径、查询参......
  • 使用 Google Colab 时,Python 包“datasets”从 virtualenv 目录“site-packages”中消
    我正在使用GoogleColab并尝试创建一个虚拟环境来工作。我的代码是:fromgoogle.colabimportdrivedrive.mount('/content/drive')!pipinstallvirtualenvmyenv_dir='/content/drive/MyDrive/virtual_env/'!virtualenv{myenv_dir}!chmod+x{myen......