2008-12-31 35 views
7

Tôi đã thiết lập ứng dụng Django sử dụng hình ảnh. Tôi nghĩ rằng tôi đã thiết lập chính xác cài đặt phương tiện MEDIA_ROOT và MEDIA_URL. Tuy nhiên, hình ảnh không hiển thị. Bạn có biết điều gì có thể là vấn đề?Django phục vụ các tập tin media như thế nào?

Hãy xem xét ví dụ sau:

Các tập tin hình ảnh dưới /home/www/media/app/ảnh và chúng tôi đang cố gắng để yêu cầu http://example.com/photos/123.jpg

Tôi có nên sử dụng các thiết lập này?

MEDIA\_ROOT = /home/www/media 

MEDIA_URL = http://example.com/app 

UPDATE: Quên đề cập đến mà tôi đang sử dụng built-in máy chủ phát triển.

Trả lời

8

Cung cấp nội dung tĩnh từ Django là không khuyến khích từ chính nhà phát triển (nếu tôi không sai, nó chỉ hoạt động khi ở chế độ gỡ lỗi). Thay vào đó, bạn nên sử dụng một máy chủ web chuyên dụng.

Nếu bạn thực sự cần thực hiện điều đó, hãy đọc tài liệu theo số how to serve static files.

+0

+1: liên kết tới tài liệu. –

1

Tôi nghi ngờ bạn đang nhận được trang 404 Django. Hãy thử truy cập trực tiếp vào một trong các hình ảnh của bạn và xem điều đó có xảy ra không.

Nếu vậy, bạn cần phải định cấu hình máy chủ web của mình thành không phải gửi yêu cầu trong hệ thống phân cấp phương tiện đến Django mà thay vào đó hãy phân phối chúng trực tiếp. Đây là một snip từ tập tin conf Apache của tôi. Phần đầu tiên yêu cầu Apache gửi mọi thứ tới Django. Phần thứ hai có "SetHandler None" có nội dung "xử lý nội dung trong/phương tiện theo cách thông thường".

Xem http://docs.djangoproject.com/en/dev/howto/deployment/modpython/ để biết tất cả chi tiết thú vị.

file httpd.conf một phần đối với PrinceOfPinot.com (AKA pop):

<Location "/"> 
    SetHandler python-program 
    PythonAutoReload Off 
    PythonDebug Off 
    PythonPath "['/var/www/production/pop', '/usr/local/lib/python2.5/site-packages/django'] + sys.path" 
    SetEnv DJANGO_SETTINGS_MODULE settings 
    PythonHandler django.core.handlers.modpython 
</Location> 

<Location "/media"> 
    SetHandler None 
    AddOutputFilterByType DEFLATE text/html text/css application/x-javascript 
</Location> 
11

CHO PHÁT TRIỂN CHỈ

Bạn có thể thiết lập một máy chủ phương tiện truyền thông tĩnh để sử dụng với máy chủ phát triển của họ bằng cách làm này trong tệp urls.py của bạn. Tôi có kèm theo mã cho thấy làm thế nào tôi sử dụng nó (cùng với các điều kiện DEBUG buộc.)

from django.conf import settings 
from django.conf.urls.defaults import *  

# Uncomment the next two lines to enable the admin: 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    (r'^$', 'views.index'),    

    # Accounts 
    (r'^accounts/login/$', 'views.user_login'), 
    (r'^accounts/logout/$', 'views.user_logout'), 

    # Contrib Modules 
    (r'^admin/(.*)', admin.site.root), 
) 

if settings.DEBUG : 
    urlpatterns += patterns('', 
     (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), 
    ) 

tôi đặt tôi MEDIA_ROOT trong một thư mục con của html/phương tiện truyền thông và liên kết với nó như vậy trong settings.py

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/') 

Sau khi phát triển xong, dự án sẽ được triển khai tới máy chủ web nơi các tệp phương tiện tĩnh sau đó được phân phát theo Apache sử dụng chỉ thị.

+1

Trong các mẫu của bạn, bạn sẽ tham khảo tệp CSS hoặc tệp hình ảnh như thế nào? Giả sử bạn có css của bạn tại html/media/styles.css. –

0

Tôi biết rằng câu hỏi ban đầu là với máy chủ dev, nhưng đối với bất kỳ ai khác đang tìm kiếm một câu trả lời môi trường sản xuất:

https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/ cung cấp một hướng dẫn về làm thế nào để có django phục vụ tập tin trong một môi trường sản xuất .Từ giai điệu của hướng dẫn, dường như có một máy chủ web riêng biệt để xử lý các tệp hoặc sử dụng mod_wsgi với Apache

3

Đây là cách hiển thị tệp hình ảnh chính xác với ImageField. Hãy tưởng tượng chúng ta có một hình ảnh lý lịch thành viên:

models.py:

UserProfile: 
    profilePic= models.ImageField(upload_to='PATH_TO_UPLOAD', blank=True, null=True) 

settings.py:

MEDIA_ROOT = 'FULL_PATH_OF_MEDIA' 
MEDIA_URL = 'URL_OF_MEDIA' 

urls.py:

urlpatterns = [ 
. 
. 
. 
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

PATH_TO_UPLOAD là con đường mà dữ liệu tải lên của người dùng diễn ra. Đây là thư mục con của FULL_PATH_OF_MEDIA, có nghĩa là các tập tin được tải lên sẽ có

FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD 

path.Now đầy đủ nội dung này có thể được truy cập tại địa chỉ này:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD 

tôi cũng khuyên bạn nên đọc bài viết này trên static_files vs media_files

doc

Các vấn đề liên quan