如何在本地Django环境中提供媒体文件? [英] How do I serve media files in a local Django environment?

查看:208
本文介绍了如何在本地Django环境中提供媒体文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以通过管理页面上传图像,但是当我导航到django生成的URL时找不到该图像。 (404错误)
文件正在上传到文件夹:

  project_root / media / eventbanner / 1 / 

我尝试了多种解决方案,但似乎没有一种适合我的情况。
Django 1.10在Ubuntu 16.04上本地运行。



我得到的网址是:

  http:// localhost:8000 / media / eventbanner / 1 / banner_image.jpg 

媒体根文件夹位于:

  / home / username / xxx / xxx / project_name / media 

HTML文件中的代码:

 < div class = banner-image> 
< img src = {{event.eventbanner.banner_image.url}} />
< / div>

url.py代码:



<$ p $来自django.conf.urls的p> 导入URL,包括来自django.contrib的
来自的管理员admin
。从django.conf导入视图
从django.conf.urls.static导入设置
静态导入

app_name ='事件'

urlpatterns = [
url(r'^ $',views.index,name ='index'),
url(r'^ details /(?P< event_id> [0-9] +)/ $' ,views.details,name ='details),
url(r'^ details /(?P< event_id> [0-9] +)/ addcomment / $',views.add_comment,name ='add_comment '),
] +静态(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)

settings.py

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

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

models.py

  def validate_only_one_instance(obj) :
model = obj .__ class__
if(model.objects.count()> 0和obj.id!= model.objects.get()。id):
引发ValidationError( 只能创建1%s实例%模型。__name__ )

类EventBanner(models.Model):
event = models.OneToOneField(Event,unique = True)
banner_image = models.ImageField(upload_to = get_image_path,blank = True ,null = True)

def clean(self):
validate_only_one_instance(self)


解决方案

此处的真正问题是此URL http:// localhost:8000 / media / eventbanner / 1 / banner_image之间没有任何关系.jpg 以及磁盘 / home / username / xxx / xxx / project_name / media 上的此位置。



在生产应用程序中,您将有一台Web服务器,用于存储 Media 内容URL将是 MEDIA_ROOT ,并且您将 ImageField.url 附加到此值以获取有效的图像路径。



这里需要为媒体图像设置Web服务器。乍一看,这似乎需要做很多工作,但是Django提供了一个快捷方式...



在开发中提供文件



您有工作吗需要做的是将媒体文件本地投放。它要求对您的 urls.py ...

  django.conf导入设置django.views.static导入
服务

#... URLconf的其余部分在这里...

(如果有设置)。调试:
urlpatterns + = [
url(r'^ media /(?P< path>。*)$),投放,{
'document_root':settings.MEDIA_ROOT,
}),
]

这使用了视图。服务位,并且只能在 DEBUG 模式下使用。它会覆盖媒体文件的路径(django是用户上传的内容,例如 ImageField 的术语)。这将通过 serve 视图重定向这些请求。最好,我可以说这是一个微型Web服务器,它将把这些请求路由映射到磁盘上的位置,并允许通过HTTP url访问这些位置。


I can upload an image through the admin page, but the image can not be found when I navigate to the url that is generated by django. (404 error) The files are being uploaded to the folder:

project_root/media/eventbanner/1/

I have tried multiple solutions but none seem to work for my situation. Django 1.10 is being run local on Ubuntu 16.04.

The url I get is:

http://localhost:8000/media/eventbanner/1/banner_image.jpg

Media root folder is located at:

/home/username/xxx/xxx/project_name/media

Code in HTML file:

<div class="banner-image">
  <img src="{{ event.eventbanner.banner_image.url }}"/>
</div>

url.py code:

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

app_name = 'events'

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^details/(?P<event_id>[0-9]+)/$', views.details, name='details'),
url(r'^details/(?P<event_id>[0-9]+)/addcomment/$', views.add_comment, name='add_comment'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py

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

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

models.py

def validate_only_one_instance(obj):
    model = obj.__class__
    if (model.objects.count() > 0 and obj.id != model.objects.get().id):
        raise ValidationError("Can only create 1 %s instance" % model.__name__)

class EventBanner(models.Model):
    event = models.OneToOneField(Event, unique=True)
    banner_image = models.ImageField(upload_to=get_image_path, blank=True, null=True)

    def clean(self):
        validate_only_one_instance(self)

解决方案

The real problem here is that there is no relationship between this url http://localhost:8000/media/eventbanner/1/banner_image.jpg and this location on disk /home/username/xxx/xxx/project_name/media.

In a production application you'd have a web server where you'd store your Media content, the serving URL would be MEDIA_ROOT and you'd append ImageField.url to this value to get a valid image path.

What you need here is to set up a web server for your media images. At first that sounds like a lot of work, but Django provides a shortcut...

Serving Files in Development

You have some work you need to do to have the media files served locally. It requires some changes to your urls.py ...

from django.conf import settings
from django.views.static import serve

# ... the rest of your URLconf goes here ...

if settings.DEBUG:
    urlpatterns += [
        url(r'^media/(?P<path>.*)$', serve, {
            'document_root': settings.MEDIA_ROOT,
        }),
    ]

This uses the views.serve bit and should only be used in DEBUG mode. It overrides the path to media files(django's term for user uploaded content like ImageField). This will redirect those requests through the serve view. Best I can tell this is a mini web server that will map those request routes to locations on disk and allow those locations to be reachable via HTTP urls.

这篇关于如何在本地Django环境中提供媒体文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆