我需要在生产模式下在 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