2012-04-18 36 views
12

Tôi là một người mới làm việc Django trong dự án đầu tiên của tôi và gặp sự cố với các tệp tĩnh.Các tệp tĩnh Django sẽ không tải

Tôi đã tạo hệ thống xác thực đơn giản bằng cách sử dụng django.contrib.auth bao gồm hai mẫu: mysite/templates/index.htmlmysite/templates/registration/login.html. Tôi có nội dung tĩnh toàn cục theo số mysite/static mà tôi muốn có thể truy cập trên tất cả các mẫu được hiển thị bởi tất cả các ứng dụng.

mysite/templates/index.html chứa <img src="{{ STATIC_URL }}pics03.jpg"/> mà ám như "static/pics03.jpg" và tải tốt khi tôi truy cập vào url localhost:8000/

mysite/templates/registration/login.html chứa <img src="{{ STATIC_URL }}pics03.jpg"/> mà cũng ám như "static/pics03.jpg" và không tải khi tôi truy cập vào url "localhost:8000/accounts/login/"

Trong url của tôi. py Tôi có:

urlpatterns = patterns('', 
    url(r'^$', 'mysite.views.home'), # plays index.html template 
    url(r'^accounts/login/$', 'django.contrib.auth.views.login'), 

Trong settings.py tôi có:

PROJECT_DIR = os.path.dirname(__file__) 

STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    os.path.join(PROJECT_DIR,'static'), 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
) 

STATIC_URL = '/static/' 

STATIC_ROOT = '' 

Tôi đã theo ấn tượng rằng Django nên tìm kiếm nội dung tĩnh toàn cầu trong STATICFILES_DIRS, nhưng nó không tìm thấy nội dung tĩnh cho login.html thậm chí nếu tôi thay đổi url trong đó để một đường dẫn tuyệt đối đến thư mục tĩnh. bất cứ ai có thể rụng bất kỳ ánh sáng về điều này?

Trả lời

18

Vấn đề của bạn là bạn arent nghe URL "/ static /" nơi nào trong urls.py

bạn Nếu bạn phục vụ ứng dụng của bạn thông qua một máy chủ web như apache hoặc nginx thì đây là chuyện bình thường như các máy chủ web sẽ xử lý chính các tệp tĩnh.

Đối với phát triển Django đi kèm với một máy chủ tĩnh built-in

để urls.py, vào cuối thêm

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
urlpatterns += staticfiles_urlpatterns() 

Điều này không là thêm/tĩnh/url và cho phép bạn phục vụ những người không có máy chủ web.

này tương đương với

url(
    regex=r'^static/(?P<path>.*)$', 
    view='django.views.static.serve', 
    kwargs={'document_root': settings.STATIC_ROOT,} 
) 

một số người sẽ nói với bạn rằng bạn cần phải quấn URL-quy tắc trong một "nếu settings.DEBUG" để sử dụng dev chỉ quy tắc, nhưng isnt này cần thiết ở tất cả và thực sự tôi thấy đó là một lời khuyên xấu.

+0

có, đây là vấn đề .. cảm ơn! – JimJay

+0

Vâng, trên thực tế trường hợp thứ hai nó là cần thiết để quấn quy tắc đó. Nếu bạn nhìn vào mã của django bạn sẽ thấy rằng khung nhìn không thực hiện bất kỳ kiểm tra nào cho DEBUG. –

+2

Chế độ xem không bao giờ được nhấn vì máy chủ web của bạn được thiết lập để thu thập và phục vụ các tệp tĩnh, vì vậy không cần kiểm tra. – krs

1

Bạn gặp sự cố khi sử dụng bản dựng trong máy chủ lưu trữ hoặc bạn đang phục vụ bằng cách sử dụng Apache hoặc tương tự? Tôi đã đấu tranh với điều này một chút. Tài liệu tôi theo dõi là: https://docs.djangoproject.com/en/dev/howto/static-files/

Phần thứ hai là chìa khóa khi bạn sẵn sàng triển khai. Bạn cần phải xác định một gốc tĩnh (sẽ trống để bắt đầu với) và chạy lệnh manage.py collectstatic để di chuyển các tệp tĩnh từ trong suốt dự án của bạn vào thư mục đó. Sau đó, bạn có thể phục vụ họ từ đó.

+0

Tôi chỉ đang sử dụng máy chủ hiện tại, chưa sẵn sàng triển khai – JimJay

0

Thay đổi STATIC_ROOT='' thành STATIC_ROOT='/' có giúp không?

Dường như với tôi sự khác biệt duy nhất là static/pics03.jpg (đường dẫn tương đối) tồn tại trên trang chủ, nhưng không nằm trên trang khác.

Đường dẫn tuyệt đối /static/pics03.jpg tồn tại trong cả hai trường hợp. Nếu thay đổi STATIC_ROOT không có tác dụng, chỉ cần thêm / vào đầu url.

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