2012-06-10 24 views
5

Tôi đang thử dự án webdev thích hợp đầu tiên của mình và tôi đang học khuôn khổ django.Các tệp tĩnh Django và filepaths trong settings.py

Tôi đến đây để hỏi về cách sạch nhất để sử dụng "tệp tĩnh", như CSS bên ngoài mà tôi đang đề cập đến trong một trong các mẫu html của tôi. Tôi đã cố gắng đọc qua các official documentation on the subject nhưng thấy nó một chút bối rối như một người mới bắt đầu, sau đó tôi đã cố gắng googling nhưng tôi nhận thấy rằng hầu hết các hướng dẫn hoặc câu trả lời stackoverflow khác nhau một chút và tôi nhận ra tôi cần một sự hiểu biết tốt hơn. Bit táo bạo để hỏi nhưng, ai đó có thể giải thích và tóm tắt quá trình với tôi?

Để tham khảo, đây là cấu trúc thư mục dự án của tôi. Tại thời điểm này tôi đang cố gắng để có được những mẫu base.html sử dụng sylesheet tại CSS/base.css: enter image description here

Ngoài ra một trong những điều mà giữ ném tôi ra là việc sử dụng filepaths tuyệt đối. Cho đến nay tôi đã xoay sở để tránh xa chỉ bằng cách sử dụng filepaths tương đối, điều này có ý nghĩa hơn với tôi vì mục đích là phát triển trên máy chủ thử nghiệm django sau đó chuyển tất cả vào máy chủ của riêng tôi khi tôi có. (lưu ý: có lẽ đó là bởi vì tôi không có ý tưởng phức tạp như thế nào mà quá trình chuyển giao là tôi không hiểu tại sao filepaths tuyệt đối được ưa thích). Có vấn đề gì với việc sử dụng tập tin đính kèm tương đối?

Tôi nhận ra rằng điều này đã trở thành hai câu hỏi, trái với quy tắc, nhưng tôi thực sự nghĩ cả hai có thể được trả lời cùng nhau và nếu tôi hiểu nó có thể sẽ giúp tôi hiểu về người khác. Bất kì sự trợ giúp nào đều được đánh giá cao.

Trả lời

2

Tôi giả sử bạn đang sử dụng Django 1.3 trở lên vì điều này cho phép bạn sử dụng staticfiles (docs) cho các tệp tĩnh. Dưới đây là ý tưởng cơ bản: mỗi trang web Django chứa nhiều ứng dụng (thư mục) chứa tất cả các tệp cần thiết cho một phần cụ thể của trang web (ví dụ: models.py, views.py, một thư mục templates và cũng là thư mục static). Thư mục static này chứa các tệp JavaScript và CSS (cũng như các tệp tĩnh khác cho ứng dụng đó.

Khi bạn triển khai trang web, bạn chạy lệnh collectstatic để thu thập tất cả các tệp tĩnh vào một thư mục. . các tập tin tĩnh để khách truy cập của trang web của bạn (ví dụ, Apache hoặc một máy chủ web khác nhau có thể làm điều đó cho bạn)

vì vậy, cấu trúc chung của dự án web của bạn có thể là:

  • manage.py
  • trang web/models.py
  • website/views.py
  • website/tĩnh/trang web/css/base.css
  • website/tĩnh/trang web/js/base.js
  • website/templates/trang web/base.html
  • tĩnh
  • settings.py
  • urls.py

Bạn sẽ nhận thấy rằng tên của ứng dụng Django được lặp lại trong các thư mục con của statictemplates thư mục. Điều này là cần thiết bởi vì nó giữ các tập tin ngoài khi chúng được chuyển đến một thư mục chung static.Trong ví dụ trên, STATIC_ROOT là thư mục static cấp cao nhất và vào thư mục này tất cả các tệp tĩnh của bạn sẽ được sao chép.

Nó chắc chắn đáng đọc tài liệu của staticfiles vì bố cục dự án này cho phép bạn sử dụng lại các ứng dụng Django trong các dự án khác một cách dễ dàng. Ví dụ, bạn có thể tưởng tượng một trang web trông như thế này:

  • blog/models.py
  • blog/templates/blog/overview.html
  • blog/templates/blog/post.html
  • blog/urls.py
  • blog/views.py
  • ảnh/models.py
  • ảnh/mẫu/ảnh/overview.html
  • pho TOS/mẫu/ảnh/photo.html
  • ảnh/urls.py
  • ảnh/views.py
  • manage.py
  • tĩnh
  • settings.py
  • urls.py

Ứng dụng blogphotos hiện có thể dễ dàng được sử dụng lại trong các trang web khác nếu muốn.

+0

Cảm ơn bạn rất nhiều cho tất cả các thông tin, tôi đánh dấu điều này là chính xác khi bạn thực hiện một số điểm rất tốt về việc giữ mã mô-đun cũng như giải thích quá trình triển khai nhiều hơn một chút. Thật không may tôi là một kẻ ngốc và chưa có thể tìm ra cách để có được dự án thực hành của riêng tôi thiết lập đúng nhưng tôi quyết định mở một câu hỏi mới, cụ thể hơn cho rằng ở đây: http://stackoverflow.com/questions/ 11033571/using-static-files-with-the-django-virtual-server – Holly

+0

Làm thế nào để làm việc này với lệnh foreman? Tôi đã có mọi thứ làm việc tốt cho đến khi tôi bắt đầu cố gắng sử dụng foreman - và nó sẽ không tải bất kỳ tài sản tĩnh cục bộ ... nhưng hoạt động tốt khi triển khai ... câu trả lời này từ Simeon là lời giải thích rõ ràng nhất mà tôi đã nhìn thấy trên quá trình xử lý các tập tin tĩnh - nhưng tôi đã hy vọng cho một số rõ ràng hơn khi sử dụng foreman vs trường hợp sống ... ngay bây giờ quản trị viên của tôi không có css khi xem trên foreman .... bất kỳ ý tưởng? – tbarbe

1

Thực sự đánh giá cao thời gian đưa vào câu trả lời của @Simeon Visser, và có một số thông tin thực sự hữu ích ở đó nhưng nó không hoàn toàn là những gì tôi đang tìm kiếm. Vì vậy, tôi hỏi xung quanh và đã sinister_user_name từ reddit cảm ơn cho điều này, mà tôi nghĩ có thể giúp người khác:


file tĩnh đã thay đổi một chút công bằng trong phiên bản gần đây nên blog cũ có thể là một chút của một mớ hỗn độn.

tôi sẽ cho nó một shot:

Trong mẫu của bạn, bạn có thể sử dụng thẻ static_url và django sẽ điền vào đường dẫn cho bạn.

<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css"> 

Nó điền vào url tĩnh bằng cách xem tệp cài đặt của bạn. STATIC_URL mặc định là /static/ Tôi nghĩ rằng trong cài đặt? Nếu các tệp tĩnh kết thúc bằng một url lạ trên máy chủ web của công ty bạn, bạn chỉ có thể thay đổi nó trong cài đặt và nó sẽ phản ánh trong tất cả các mẫu. Vì vậy, nó không quan trọng nếu họ là tuyệt đối.

Khi bạn đi triển khai, bạn điền vào STATIC_ROOT trong cài đặt của mình, đây chỉ là đường dẫn bạn đã đặt máy chủ web của mình để tìm tệp tĩnh. Sau đó, nếu bạn chạy manage.py collectstatic và nó sẽ sao chép chúng vào thư mục đó. Đó là chức năng duy nhất của STATIC_ROOT Tôi nghĩ vậy.

Tôi giữ thư mục mẫu tách biệt khỏi thư mục tĩnh của tôi, chủ yếu là vì bạn muốn máy chủ web của bạn chỉ phục vụ các tệp tĩnh, trong khi các mẫu được xử lý bằng python. Vì vậy, các tệp tĩnh gần như không phải là một phần của ứng dụng của bạn khi máy chủ web xem chúng. Tôi giữ mẫu của tôi và các tập tin tĩnh trong đường dẫn riêng biệt chỉ trong thư mục cơ sở, chủ yếu là bởi vì cả hai đều không phải là tập tin mã nguồn python.

Vì vậy, cấu trúc dự án của tôi sẽ như thế nào:

manage.py 
website/settings.py 
app/models.py 
app/views.py 
templates/base.html 
static/js/jquery.js 
static/css/bootstrap.css 

Vấn đề với đường dẫn tương đối là họ sẽ cần phải thay đổi nếu url thay đổi kế hoạch của bạn.

Tùy chọn: Tôi tìm thấy trong blog này giúp không đặt đường dẫn hệ thống tệp tuyệt đối vào settings.py tốt nếu bạn làm việc từ nhiều máy ví dụ như công việc và gia đình: ( Với bố cục hơi khác nhau cho 1,4 tôi sử dụng này ở đầu xác lập cá nhân:

import os 
import django 
import manage 

DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) 
SITE_ROOT = os.path.dirname(os.path.realpath(manage.__file__)) 

thay vì những gì họ đề nghị (vị trí của các thiết lập đã di chuyển trong 1.4 hoặc 1.3) để SITE_ROOT là điều sai lầm tôi nghĩ rằng có thể làm việc thêm về xuống trong.. cài đặt tôi sử dụng:

# Additional locations of static files 
STATICFILES_DIRS = (
    os.path.join(SITE_ROOT, 'static'), 
) 

Điều này sẽ cho máy chủ phát triển biết nơi tìm các tệp tĩnh. Bạn có thể làm tương tự cho các mẫu hoặc chỉ sử dụng đường dẫn tệp đầy đủ.

+1

Thông tin của bạn cũng chính xác mặc dù thiết lập của bạn ít mô đun hơn. Lý tưởng nhất, tất cả các tệp tĩnh và tệp khuôn mẫu phải nằm trong thư mục bên trong một ứng dụng (chỉ với một vài ngoại lệ, chẳng hạn như 404.html và 500.html cần được đặt trong thư mục mẫu gốc).Khi phát triển cục bộ, thư mục 'STATIC_ROOT' sẽ trống và nó chỉ nên có các tệp trong đó trên máy chủ sản xuất. –

4

Đây là một tập hợp các đoạn mã từ settings.py tôi đã thay đổi để bao gồm các tập tin tĩnh thiết lập Django cho dự án drchrono.

import os 
import django 
DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) 
SITE_ROOT = os.path.dirname(os.path.realpath(__file__)) 

biến thiết lập động cho thư mục SITE_ROOT

DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3', 
      'NAME': os.path.join(SITE_ROOT,'data.db'),      

nơi cơ sở dữ liệu sqlite3 được lưu trữ nó cần địa chỉ tuyệt đối

  'USER': '', 
      'PASSWORD': '', 
      'HOST': '',      
      'PORT': '',      
     } 
    } 


STATIC_ROOT = SITE_ROOT 
STATIC_URL = '/static/' 

lưu trữ các file tĩnh đây

STATICFILES_DIRS = (
    os.path.join(SITE_ROOT,'static'), 
     ) 

nơi thứ e mẫu được lưu trữ

TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT,'templates'), 

) 

Bây giờ trong các mẫu sử dụng

{% load static %} --at beginning 
<link href="{% static "css/bootstrap.min.css"%}" rel="stylesheet" media="screen"> 

này là một ví dụ cho thấy làm thế nào để truy cập vào "css/bootstrap.min.css" trong thư mục tĩnh

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