簡體   English   中英

如何在本地 Django 環境中提供媒體文件?

[英]How do I serve media files in a local Django environment?

我可以通過管理頁面上傳圖片,但是當我導航到 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 代碼:

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)

設置.py

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

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

模型.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)

這里真正的問題是這個 url http://localhost:8000/media/eventbanner/1/banner_image.jpg和磁盤上的這個位置之間沒有關系/home/username/xxx/xxx/project_name/media

在生產應用程序中,您有一個 Web 服務器用於存儲Media內容,服務 URL 將是MEDIA_ROOT並且您將ImageField.url附加到此值以獲得有效的圖像路徑。

您需要在這里為您的媒體圖像設置一個網絡服務器。 起初這聽起來像是很多工作,但 Django 提供了一個快捷方式......

在開發中提供文件

您需要做一些工作才能在本地提供媒體文件。 它需要對您的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,
        }),
    ]

這使用views.serve位並且應該只在DEBUG模式下使用。 它覆蓋了媒體文件的路徑(django 的用戶上傳內容的術語,如ImageField )。 這將通過serve視圖重定向這些請求。 我能說的最好的是這是一個迷你 Web 服務器,它將這些請求路由映射到磁盤上的位置,並允許通過 HTTP url 訪問這些位置。

至少從 Django 1.8 開始,有一個輔助函數static()可以為您設置並確保它僅在調試模式下運行。

你的urls.py應該是這樣的:

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

...簡單地引用文檔。

確保您的MEDIA_URL設置為像/media/這樣的相對路徑,並且您的MEDIA_ROOT是像/home/foo/project/media這樣的絕對文件系統路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM