如何在django生产环境中提供媒体文件?

时间:2016-08-20 06:32:57

标签: python django

在我的settings.py文件中: -

DEBUG = False
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

STATIC_URL = '/static/'
LOGIN_URL = '/login/'
MEDIA_URL = '/media/'

在我的urls.py文件中: -

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

当我上传个人资料图片时,它会上传到指定的文件夹。但是当我访问用户个人资料网址时,我在终端

中收到这样的错误
"GET /media/profile_images/a_34.jpg HTTP/1.1" 404 103

a_34.png出现在/ media / profile_images /

然后为什么它没有在浏览器上显示,我收到404错误?

5 个答案:

答案 0 :(得分:6)

Django不是为了在生产环境中提供媒体文件。您必须直接从Web服务器进行配置。

例如

如果您在生产中使用apache Web服务器,请将以下内容添加到您的虚拟主机配置

Alias /media/ /path/to/media_file/

<Directory /path/to/media_file/>
Order deny,allow
Allow from all
</Directory>

如果您使用Nginx,您将拥有类似的配置。

答案 1 :(得分:4)

Django不鼓励在服务器上提供生产媒体文件。使用像amazon s3这样的云服务来为您的媒体文件提供服务。请参阅此Django doc serve media,然后在MEDIA_URL中提供该路径。

答案 2 :(得分:1)

您需要设置服务器以在生产中提供静态内容。当只有Debug为True时,Django会提供静态内容。所以你需要

1)设置服务器

2)将服务器媒体路径指向STATIC_ROOT目录

3)运行django的collectstatic命令将所有静态文件收集到STATIC_ROOT。 请参考

https://docs.djangoproject.com/en/1.10/howto/static-files/

答案 3 :(得分:1)

您可以将S3 Amazon用于静态和媒体文件。会更好。

S3 Amazon的问题

使S3存储桶显示为文件系统的一部分具有可怕的性能并且随机失败。当我们复制大量文件时,复制完成需要10分钟,15分钟或20分钟才能完成,因此部署需要很长时间才能完成。如果我们将这些直接发送到S3,则相同的复制命令大约需要1分钟才能完成。

<强>解决方案

Subclass S3BotoStorage两次,一个用于静态文件,另一个用于媒体文件。这允许我们为每种类型使用不同的存储桶和子目录。 (参见:custom_storage.py)

更新设置

1. AWS_STORAGE_BUCKET_NAME  needs to be bucket to hold static files and media files
2. MEDIAFILES_BUCKET
3. MEDIAFILES_LOCATION
4.DEFAULT_FILE_STORAGE
5.STATICFILES_BUCKET
6.STATICFILES_LOCATION
This is the subdirectory under the S3 bucket for the app
7.STATIC_URL
8.STATICFILES_STORAGE

使用以下内容创建 custom_storage.py

from django.utils.deconstruct import deconstructible
from storages.backends.s3boto import S3BotoStorage
from django.conf import settings

@deconstructible
class StaticS3Storage(S3BotoStorage):
   bucket_name = settings.STATICFILES_BUCKET
   location = settings.STATICFILES_LOCATION

@deconstructible
class MediaS3Storage(S3BotoStorage):
   bucket_name = settings.MEDIAFILES_BUCKET
   location = settings.MEDIAFILES_LOCATION

根据我的stack.json

对更新设置示例 settings.py.tmpl (如上所述)
MEDIAFILES_BUCKET = '<%= @node["apps_data"]["aws"]["buckets"]["bucket-name"] %>'
MEDIAFILES_LOCATION = 'folder_name_for_media_files_in_bucket'
DEFAULT_FILE_STORAGE = 'custom_storage.MediaS3Storage'

# If we're not using our S3 backend storage we need to serve the media files via path
   if DEFAULT_FILE_STORAGE == "custom_storage.MediaS3Storage":
       MEDIA_URL = 'https://%s.s3-website-us-east-1.amazonaws.com/%s/' %      (MEDIAFILES_BUCKET, MEDIAFILES_LOCATION)
   else:
       MEDIA_URL = '/media/'

   STATICFILES_BUCKET = '<%= @node["apps_data"]["aws"]["buckets"]["bucket-name"] %>'
   STATICFILES_LOCATION = 'folder_name_for_static_files_in_bucket'
   STATICFILES_STORAGE = '<%= @node["deploy_data"]["project_name"]["django_static_files_storage"] %>'

# If we're not using our S3 backend storage we need to serve the static files via path
   if STATICFILES_STORAGE == "custom_storage.StaticS3Storage":
       STATIC_URL = 'https://%s.s3-website-us-east-1.amazonaws.com/%s/' % (STATICFILES_BUCKET, STATICFILES_LOCATION)
   else:
       STATIC_URL = '/static/'

从staticfiles Django Template Tag

加载静态

将模板中 {%load static%} 的所有用途更改为 {%load static from staticfiles%}

静态文件中的“静态”可以使用不同的文件后端,包括S3后端或本地文件后端。使用“load static”使用不处理不同后端的Django模板标签库。

在包含静态文件时以及在包含“static from staticfiles”之后在模板中使用它: {%static“path / to / the / file.ext”%} 这将找出文件的完整路径,或者如果它在S3中,它将在文件中插入完整的URL。

示例

<link rel="stylesheet" type="text/css" href="{% load static from staticfiles %}{% static "css/style.css" %}”>

实用信息

“django.contrib.staticfiles.storage.StaticFilesStorage”是默认的Django静态文件后端

<强>参考

https://docs.djangoproject.com/en/1.9/howto/static-files/ https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/

答案 4 :(得分:0)

对于nginx,它适用于以下配置行:

client.on('error'

另请参见《代码审查》中的my related question