ความแตกต่างระหว่าง STATIC_URL แบบคงที่และ STATIC_ROOT บน Django


127

ฉันสับสนstatic rootและต้องการชี้แจงสิ่งต่างๆ

ในการให้บริการไฟล์แบบคงที่ใน Django สิ่งต่อไปนี้ควรอยู่ในsettings.pyและurls.py:

import os
PROJECT_DIR=os.path.dirname(__file__)

1. พา ธ สัมบูรณ์ไปยังไดเร็กทอรีที่ควรรวบรวมไฟล์แบบคงที่

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2. คำนำหน้า URL สำหรับไฟล์คงที่

STATIC_URL = '/static/'

3. ตำแหน่งเพิ่มเติมสำหรับไฟล์คงที่

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

... และในurls.pyบรรทัดต่อไปนี้:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4. เรายังใช้ python manage.py collectstatic

คำถาม:

  1. ใครช่วยอธิบายขั้นตอนการทำงานให้ฉันฟังได้ไหมว่าควรทำอย่างไร ณ ตอนนี้ฉันคัดลอก / วางข้อมูลโค้ดด้านบนลงในตำแหน่งที่กำหนดและสร้างไฟล์ใหม่ในไดเร็กทอรีแบบคงที่และใช้งานได้ อย่างไรก็ตามในของsettings.STATIC_ROOTฉันฉันได้ชี้ไปที่ไดเรกทอรีอื่น

  2. จะดีมากถ้ามีคนอธิบายขั้นตอนการทำงานของแต่ละการตั้งค่าได้: วิธีรวบรวมและจัดการไฟล์และสิ่งที่ควรปฏิบัติตาม

ขอบคุณ


คุณช่วยอธิบายความหมายของ 'อธิบายขั้นตอนการทำงาน' ได้หรือไม่ นอกจากนี้รูปแบบ URL ของคุณควรเป็นไปตามเงื่อนไขหากคุณกำลังพัฒนาในส่วนที่ 3 คุณสามารถทำได้โดยการเพิ่มif settings.DEBUG:django ไม่ค่อยดีในการให้บริการสื่อแบบคงที่ซึ่งควรปล่อยให้เป็นเว็บเซิร์ฟเวอร์จริง
dm03514

สวัสดี @ user993563 ฉันไม่พบวิธีแก้ปัญหาในหลาย ๆ ฟอรัมสิ่งที่ฉันต้องการ แต่คำถามของคุณอธิบายได้ชัดเจนขอบคุณผู้ชาย ... เยี่ยมมาก ...
Mohideen bin Mohammed

คำอธิบายที่ดีขอบคุณ
Ajay Kumar

คำตอบ:


90

STATIC_ROOT

พา ธ สัมบูรณ์ไปยังไดเร็กทอรีที่./manage.py collectstaticจะรวบรวมไฟล์แบบคงที่สำหรับการปรับใช้ ตัวอย่าง:STATIC_ROOT="/var/www/example.com/static/"

ขณะนี้คำสั่ง./manage.py collectstaticจะคัดลอกไฟล์ทั้งหมดที่คงที่ (เช่นในโฟลเดอร์แบบคงที่ในปพลิเคชันของคุณไฟล์แบบคงที่ในทุกเส้นทาง) /var/www/example.com/static/ไปยังไดเรกทอรี ตอนนี้คุณต้องให้บริการไดเร็กทอรีนี้บน apache หรือ nginx..etc เท่านั้น

STATIC_URL

URLซึ่งไฟล์แบบคงที่ในSTATIC_ROOTไดเรกทอรีเสิร์ฟ (โดย Apache หรือ nginx..etc) ตัวอย่าง: /static/หรือhttp://static.example.com/

หากคุณตั้งค่าSTATIC_URL = 'http://static.example.com/'คุณจะต้องให้บริการSTATIC_ROOTโฟลเดอร์ (เช่น"/var/www/example.com/static/") โดย apache หรือ nginx ที่ url 'http://static.example.com/'(เพื่อให้คุณสามารถอ้างอิงไฟล์คงที่'/var/www/example.com/static/jquery.js'ด้วย'http://static.example.com/jquery.js')

ตอนนี้ในเทมเพลต django ของคุณคุณสามารถอ้างอิงได้โดย:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

ซึ่งจะแสดง:

<script src="http://static.example.com/jquery.js"></script>

1
ความแตกต่างระหว่างตัวอย่างของคุณกับสิ่งนี้คืออะไร: href = "{% static" jquery.js "%}"
ผู้ใช้

8
@macdonjo ทั้งคู่{{ STATIC_URL }}jquery.jsและ{% static "jquery.js" %}เหมือนกัน /static/jquery.jsคือทั้งสองจะกลับมา บทความที่ใหม่กว่า Djangoรุ่นแนะนำให้ใช้{% static "jquery.js" %}แต่คุณจำเป็นต้องโหลด templatetag {% load staticfiles %}คือ ในdjangoรุ่นเก่าแนะนำ{{STATIC_URL}}
suhailvs

ฉันเห็น. ฉันพยายามค้นหาจุดบกพร่องที่ทำให้เทมเพลตส่วนใหญ่โหลดสไตล์ชีตยกเว้นหน้าเดียว ฉันเปลี่ยนเป็นstaticวิธีการแทนSTATIC_URLวิธีการและจุดบกพร่องก็หายไป ขอคำแนะนำตามรุ่นได้ดี
ผู้ใช้

37

STATICFILES_DIRS: คุณสามารถเก็บไฟล์แบบคงที่สำหรับโครงการของคุณได้ที่นี่เช่นไฟล์ที่แม่แบบของคุณใช้

STATIC_ROOT: ปล่อยว่างไว้เมื่อคุณทำmanage.py collectstaticมันจะค้นหาไฟล์คงที่ทั้งหมดในระบบของคุณและย้ายมาที่นี่ เซิร์ฟเวอร์ไฟล์แบบคงที่ของคุณควรถูกแมปกับโฟลเดอร์นี้ไม่ว่าจะอยู่ที่ใดก็ตาม ตรวจสอบหลังจากเรียกใช้ collectstatic แล้วคุณจะพบโครงสร้างไดเร็กทอรี django ได้สร้างขึ้น

-------- แก้ไข ----------------

ตามที่ @DarkCygnus ชี้ไว้ STATIC_ROOT ควรชี้ไปที่ไดเร็กทอรีบนระบบไฟล์ของคุณโฟลเดอร์ควรว่างเปล่าเนื่องจาก Django จะถูกเติมข้อมูล

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

หรือ

STATIC_ROOT = '/opt/web/project/static_files'

-------- สิ้นสุดการแก้ไข -----------------

STATIC_URL: โดยปกติแล้ว '/ static /' เป็นเพียงคำนำหน้าสำหรับไฟล์คงที่


2
ที่นี่ลิงค์ไปยังการจัดการไฟล์แบบคงที่ใน 1.3 docs.djangoproject.com/en/1.3/howto/static-files
keni

2
STATICFILES_DIRSควรทำหน้าที่เป็น dirs เพิ่มเติมสำหรับการคง files.If คุณใส่ CSS ของคุณ / js / ภาพทั้งหมดลงในป APP_NAME / คงที่ / APP_NAME STATICFILES_DIRSโฟลเดอร์นั้นมีความจำเป็นต้องระบุ
laike9m

ขอบคุณสำหรับคำตอบเกี่ยวกับการปล่อยให้ STATIC_ROOT ว่างเปล่าฉันต้องระบุในsettings.py(โดยการทำSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) ก่อนที่จะเรียกใช้คำสั่ง collectstatic
DarkCygnus

ฉันเห็นว่ามันทำให้เข้าใจผิดได้ง่ายแค่ไหน สิ่งที่ฉันหมายถึงการปล่อยให้ว่างเปล่าคือโดยปกติจะเริ่มว่างเปล่าไม่มีไฟล์อยู่ในนั้น ฉันจะอัปเดตคำตอบเพื่อขจัดความสับสน
keni

2

คำตอบทั้งหมดข้างต้นมีประโยชน์ แต่ไม่มีใครแก้ปัญหาของฉันได้ ในไฟล์การผลิตของฉัน STATIC_URL ของฉันคือhttps://<URL>/staticและฉันใช้ STATIC_URL เดียวกันในไฟล์ dev settings.py ของฉัน

สิ่งนี้ทำให้เกิดความล้มเหลวแบบไม่โต้ตอบใน django / conf / urls / static.py

การทดสอบelif not settings.DEBUG or '://' in prefix: เลือก "//" ใน URL และไม่เพิ่มรูปแบบ URL คงที่ทำให้ไม่พบไฟล์คงที่

จะเป็นการดีหาก Django พ่นข้อความแสดงข้อผิดพลาดที่ระบุว่าคุณไม่สามารถใช้http(s)://กับไฟล์DEBUG = True

ฉันต้องเปลี่ยน STATIC_URL เป็น "/ static /"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.