Django - Không tìm thấy tệp tĩnh


80

Tôi đã xem một số bài đăng cho vấn đề này nhưng không tìm thấy giải pháp của mình.

Tôi đang cố gắng cung cấp các tệp tĩnh trong môi trường phát triển Django 1.3 của mình.

Đây là cài đặt của tôi

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...

Urls.py của tôi

urlpatterns = patterns('',
...
  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),
...
);

Thư mục / home / glide / Documents / django / cbox / static / của tôi giống như

css
  main.css
javascript
image

Tôi gặp lỗi 404 khi cố gắng truy cập http://127.0.0.1:8000/static/css/main.css .

Tôi có phải chỉ định các mẫu cho css, javascript và hình ảnh riêng lẻ không?

Câu trả lời:


109

Tôi đã nhầm lẫn giữa STATIC_ROOTSTATICFILES_DIRS

Trên thực tế, tôi không thực sự hiểu về tiện ích của STATIC_ROOT . Tôi nghĩ rằng đó là thư mục mà tôi phải đặt các tệp chung của mình. Thư mục này được sử dụng cho quá trình sản xuất, đây là thư mục mà các tệp tĩnh sẽ được đưa vào (thu thập) bởi collectstatic .

STATICFILES_DIRS là cái mà tôi cần.

Vì tôi đang ở trong môi trường phát triển, giải pháp cho tôi là không sử dụng STATIC_ROOT (hoặc chỉ định một đường dẫn khác) và đặt thư mục tệp chung của tôi trong STATICFILES_DIRS :

#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static_files/'))
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATICFILES_DIRS = (
  os.path.join(SITE_ROOT, 'static/'),
)

Cũng đừng quên from django.conf import settings


2
Không những urls.py nên giống như trong câu hỏi (điều tương tự đối với phương tiện truyền thông) và đừng quên from django.conf import settingstất nhiên
Pierre de LESPINAY

Tôi chỉ muốn thêm vào câu trả lời này, đừng bỏ lỡ s. nó phải là STATICFILES_DIRS. Tôi đã thực hiện STATICFILE_DIRS, khiến tôi phát điên trong 45 phút tìm kiếm lỗi.
niccolo m.

1
Tôi sử dụng BASE_DIRconst tích hợp thay vì SITE_ROOTvà nó hoạt động.
Maduka Jayalath

33

Có thể chỉ có hai điều settings.pygây ra vấn đề cho bạn.

1) STATIC_URL = '/static/'

2)

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

và các tệp tĩnh của bạn phải nằm trong thư mục tĩnh nằm trong cùng thư mục với tệp cài đặt của dự án.

Ngay cả khi các tệp tĩnh của bạn không tải thì lý do là, bạn có thể đã giữ

DEBUG = False

thay đổi thành True (chỉ dành cho phát triển). Trong quá trình sản xuất, chỉ cần thay đổi STATICFILES_DIRSthành bất kỳ đường dẫn nào có tệp tĩnh.


2
Trong trường hợp của tôi, biến môi trường của tôi để gỡ lỗi là sai. Tôi thiết lập nó là true và bây giờ làm việc của nó
Smit Patel

Xin chào..Tôi đã thử tất cả các giải pháp được đề cập nhưng nó vẫn cho tôi 404. Ai đó có thể giúp tôi không?
Mukul_Vashistha

32

Việc cung cấp các tệp tĩnh có thể đạt được theo một số cách; đây là những ghi chú của tôi cho bản thân:

  • thêm static/my_app/thư mục vào my_app(xem ghi chú về không gian tên bên dưới)
  • xác định một thư mục cấp cao nhất mới và thêm nó vào STATICFILES_DIRS trong settings.py (lưu ý rằng The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting)

Tôi thích cách đầu tiên hơn và thiết lập gần với cách được xác định trong tài liệu , vì vậy để phân phát tệp admin-custom.cssghi đè một vài kiểu quản trị, tôi có một thiết lập như sau:

.
├── my_app/
│   ├── static/
│   │   └── my_app/
│   │       └── admin-custom.css
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── static/
├── templates/
│   └── admin/
│       └── base.html
└── manage.py
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

Điều này sau đó được sử dụng trong mẫu như sau:

# /templates/admin/base.html
{% extends "admin/base.html" %}
{% load static %}

{% block extrahead %}
    <link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}

Trong quá trình phát triển, nếu bạn sử dụng django.contrib.staticfiles [ed: install by default], điều này sẽ được thực hiện tự động bởi máy chủ chạy khi DEBUG được đặt thành True [...]

https://docs.djangoproject.com/en/1.10/howto/static-files/

Khi triển khai, tôi chạy collectstaticvà cung cấp các tệp tĩnh với nginx.


Các tài liệu đã giải tỏa mọi bối rối cho tôi:

STATIC_ROOT

Đường dẫn tuyệt đối đến thư mục nơi Collectstatic sẽ thu thập các tệp tĩnh để triển khai.

... nó không phải là nơi lưu trữ vĩnh viễn các tệp tĩnh của bạn. Bạn nên làm điều đó trong các thư mục sẽ được tìm thấy bởi các công cụ tìm của staticfiles, theo mặc định, là các thư mục con ứng dụng 'tĩnh /' và bất kỳ thư mục nào bạn đưa vào STATICFILES_DIRS).

https://docs.djangoproject.com/en/1.10/ref/settings/#static-root


Khoảng cách tên tệp tĩnh

Bây giờ chúng ta có thể thoát khỏi việc đưa các tệp tĩnh của mình trực tiếp vào my_app / static / (thay vì tạo một thư mục con my_app khác), nhưng đó thực sự là một ý tưởng tồi. Django sẽ sử dụng tệp tĩnh đầu tiên mà nó tìm thấy có tên khớp và nếu bạn có tệp tĩnh có cùng tên trong một ứng dụng khác, Django sẽ không thể phân biệt giữa chúng. Chúng ta cần phải chỉ ra Django ở đúng vị trí và cách dễ nhất để đảm bảo điều này là đặt tên cho chúng. Đó là, bằng cách đặt các tệp tĩnh đó bên trong một thư mục khác được đặt tên cho chính ứng dụng đó.

https://docs.djangoproject.com/en/1.10/howto/static-files/


STATICFILES_DIRS

Dự án của bạn có thể cũng sẽ có các tài sản tĩnh không gắn với một ứng dụng cụ thể. Ngoài việc sử dụng thư mục tĩnh / bên trong ứng dụng của mình, bạn có thể xác định danh sách các thư mục (STATICFILES_DIRS) trong tệp cài đặt của mình, nơi Django cũng sẽ tìm kiếm các tệp tĩnh.

https://docs.djangoproject.com/en/1.10/howto/static-files/


8

Nếu URL tĩnh của bạn đúng nhưng vẫn:

Không tìm thấy: /static/css/main.css

Có lẽ vấn đề WSGI của bạn.

➡ Cấu hình WSGI phục vụ cả môi trường phát triển và môi trường sản xuất

==========================project/project/wsgi.py==========================

import os
from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
if settings.DEBUG:
    application = StaticFilesHandler(get_wsgi_application())
else:
    application = get_wsgi_application()

6
  1. Bạn có thể xóa STATIC_ROOTdòng
  2. Hoặc bạn có thể tạo một staticthư mục khác trong thư mục khác. Giả sử thư mục là: project\static Bây giờ hãy cập nhật:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Dù bạn làm gì, điểm chính là STATICFILES_DIRSSTATIC_ROOTkhông nên chứa cùng một thư mục.

Mình biết cũng lâu rồi nhưng mong các bạn mới tham gia giúp đỡ


3

Một lỗi khác có thể không có ứng dụng của bạn được liệt kê trong INSTALLED_APPSdanh sách như:

INSTALLED_APPS = [
    # ...
    'your_app',
]

Nếu không có nó, bạn có thể đối mặt với các vấn đề như không phát hiện các tệp tĩnh của bạn, về cơ bản là tất cả các tệp liên quan đến ứng dụng của bạn. Mặc dù nó có thể đúng như được gợi ý trong câu trả lời đúng bằng cách sử dụng:

STATICFILES_DIRS = (adding/path/of/your/app)

Có thể là một trong những lỗi và cần được xem xét lại nếu mắc phải lỗi này.


2

Tôi giải quyết vấn đề này bằng cách thêm tên dự án của mình trong INSTALLED_APPS.nhập mô tả hình ảnh ở đây


này cố định nó cho tôi nhưng tôi nghĩ rằng tôi có thể cần một giải pháp tốt hơn mỗi ứng dụng nên có thư mục tĩnh riêng của mình trong trường hợp của tôi
SeanDp32

1

Tôi thấy rằng tôi đã di chuyển DEBUGcài đặt của mình trong cài đặt cục bộ để bị ghi đè bởi một Falsegiá trị mặc định . Về cơ bản, hãy xem xét để đảm bảo cài đặt GỠ LỖI thực sự là sai nếu bạn đang phát triển với DEBUGrunserver.


1

Trong lệnh cmd của bạn, python manage.py findstatic --verbosity 2 static nó sẽ đưa ra thư mục mà Django đang tìm kiếm các tệp tĩnh, nếu bạn đã tạo một môi trường ảo thì sẽ có một thư mục tĩnh bên trong thư mục virtual_enosystem_name này. VIRTUAL_ENVIRONMENT_NAME\Lib\site-packages\django\contrib\admin\static. Khi chạy lệnh 'findstatic' ở trên nếu Django hiển thị cho bạn đường dẫn này thì chỉ cần dán tất cả các tệp tĩnh của bạn vào thư mục tĩnh này. Trong tệp html của bạn, hãy sử dụng cú pháp JINJA cho href và kiểm tra css nội dòng khác. Nếu vẫn còn một hình ảnh src hoặc url sau khi đưa ra cú pháp JINJA thì hãy thêm nó bằng '/ static'. Điều này đã làm việc cho tôi.


1
TEMPLATE_DIR=os.path.join(BASE_DIR,'templates')
STATIC_DIR=os.path.join(BASE_DIR,'static')

STATICFILES_DIRS=[STATIC_DIR]

1

Có thể có những điều sau đây trong settings của bạn.py:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': ["templates"],

'APP_DIRS': True,

'OPTIONS': {
# ... một số tùy chọn tại đây .. .
},
},]

HOẶC LÀ

STATIC_URL = '/ static /'

HOẶC LÀ

STATICFILES_DIRS = (os.path.join (BASE_DIR, "static"),)


0

Nếu bạn đã thêm django-storagesmô-đun (để hỗ trợ tải tệp lên S3 trong ứng dụng django của bạn chẳng hạn) và nếu giống như tôi, bạn không đọc chính xác tài liệu của mô-đun này , chỉ cần xóa dòng này khỏi settings.py:

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

Nếu không, nó sẽ khiến nội dung tĩnh của bạn KHÔNG được xem trên máy cục bộ của bạn mà là từ xa trong nhóm S3, bao gồm CSS của bảng quản trị và do đó phá vỡ hiệu quả CSS của bảng quản trị.


0

STATICFILES_DIRS được sử dụng trong phát triểnSTATIC_ROOTtrong sản xuất ,

STATICFILES_DIRSSTATIC_ROOTkhông được có cùng tên thư mục,

Nếu bạn cần sử dụng cùng một thư mục tĩnh trong quá trình phát triển và sản xuất, hãy thử phương pháp này

bao gồm cái này trong settings.py

import socket

HOSTNAME = socket.gethostname()

# if hostname same as production url name use STATIC_ROOT 
if HOSTNAME == 'www.example.com':
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")

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

-1

{'document_root', settings.STATIC_ROOT} cần phải được {'document_root': settings.STATIC_ROOT}

hoặc bạn sẽ gặp một lỗi như dictionary update sequence element #0 has length 6; 2 is required

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.