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

Python 如何在Django生产环境中提供媒体文件?,python,django,Python,Django,在me 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/' 在my urls.py文件中:- urlpatterns

在me 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/'
在my urls.py文件中:-

urlpatterns += static(settings.STATIC_URL, document_root = settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
当我上载配置文件图像时,它将上载到指定的文件夹。但当我访问用户配置文件url时,我会在终端中遇到这样的错误

"GET /media/profile_images/a_34.jpg HTTP/1.1" 404 103
a_34.png出现在/media/profile_图像中/


那个么为什么它并没有显示在浏览器上,而我收到了404错误?

Django并不是用来在生产环境中提供媒体文件的。您必须直接从web服务器进行配置

比如说

如果在生产环境中使用apache web服务器,请将以下内容添加到virtualhost配置中

Alias /media/ /path/to/media_file/

<Directory /path/to/media_file/>
Order deny,allow
Allow from all
</Directory>
Alias/media//path/to/media\u文件/
命令拒绝,允许
通融

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

您需要设置一个服务器,以便在生产环境中提供静态内容。当only Debug为True时,Django提供静态内容。所以你需要

1) 设置服务器

2) 指向静态根目录的服务器媒体路径

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


Django不鼓励从服务器在生产中提供媒体文件。使用像AmazonS3这样的云服务为您的媒体文件提供服务器。看到这个,然后在媒体URL中给出那个路径

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


亚马逊S3问题

使S3 bucket作为文件系统的一部分出现会带来糟糕的性能,并且会随机失败。当我们复制大量文件时,可能需要10、15或20分钟的时间才能完成复制,使部署在不需要时需要很长时间。如果我们直接将它们发送到S3中,同样的复制命令大约需要1分钟才能完成

解决方案

子类S3BOToRage两次,一个类用于静态文件,另一个类用于媒体文件。这允许我们为每种类型使用不同的bucket和子目录。(请参见: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

使用以下内容创建自定义存储.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

示例settings.py.tmpl用于基于my stack.json的更新设置(如上所述)

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/'
MEDIAFILES\u BUCKET=''
MEDIAFILES\u位置='文件夹\u名称\u用于\u bucket中的\u媒体\u文件'
默认\u文件\u存储='自定义\u存储.MediaS3Storage'
#如果我们不使用S3后端存储,我们需要通过path为媒体文件提供服务
如果默认_文件_存储==“自定义_存储.MediaS3Storage”:
媒体URL='https://%s.s3-website-us-east-1.amazonaws.com/%s/'%(媒体文件存储桶,媒体文件存储位置)
其他:
媒体URL='/MEDIA/'
静态文件\u BUCKET=“”
STATICFILES\u LOCATION='文件夹\u名称\u用于\u bucket中的\u静态文件\u'
静态文件存储=“”
#如果我们不使用S3后端存储,我们需要通过path为静态文件提供服务
如果STATICFILES\u STORAGE==“custom\u STORAGE.StaticS3Storage”:
静态URL='https://%s.s3-website-us-east-1.amazonaws.com/%s/'%(静态文件存储桶,静态文件存储位置)
其他:
静态URL='/STATIC/'

从staticfiles Django模板标记加载静态文件 将模板中{%load static%}的所有用法更改为{%load static from staticfiles%}

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

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

示例

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

对于nginx,它通过以下配置行为我工作:

location /media {
    alias /home/ubuntu/speedy-net/media; # Change to your own media directory here.
    access_log off;
}

另请参见代码回顾。

因为Django人坚持在生产中您应该将Web服务器配置为指向该静态媒体根。@AnttiHaapala我现在该怎么办?