จุดรวมของ Django คืออะไร?


91

นี่อาจเป็นคำถามโง่ ๆ แต่ก็ไม่ได้คลิกเข้ามาในหัวของฉัน

ใน Django, การประชุมคือการวางไฟล์ทั้งหมดของคุณคงที่ (เช่น CSS, js) เฉพาะแอปของคุณลงในโฟลเดอร์ที่เรียกว่าแบบคงที่ ดังนั้นโครงสร้างจะมีลักษณะดังนี้:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

ในmysite/settings.pyฉันมี:

STATIC_ROOT = 'staticfiles'

ดังนั้นเมื่อฉันรันคำสั่ง:

python manage.py collectstatic   

สร้างโฟลเดอร์ที่เรียกว่าstaticfilesระดับราก (เช่นเดียวกับไดเรกทอรีmyapp/)

ประเด็นนี้คืออะไร? ไม่ใช่แค่การสร้างสำเนาไฟล์คงที่ทั้งหมดของฉันหรือไม่

คำตอบ:


72

รวบรวมไฟล์แบบคงที่จากหลาย ๆ แอพลงในพา ธ เดียว

ดี, Django เดี่ยวโครงการอาจจะใช้หลายแอพพลิเคดังนั้นในขณะที่มีคุณมีเพียงหนึ่งmyappมันอาจจะเป็นจริงmyapp1, myapp2ฯลฯ

โดยการคัดลอกจากภายในแอพแต่ละตัวลงในโฟลเดอร์เดียวคุณสามารถชี้เว็บเซิร์ฟเวอร์ส่วนหน้า (เช่น nginx) ไปที่โฟลเดอร์เดียวSTATIC_ROOTและให้บริการไฟล์แบบคงที่จากที่เดียวแทนที่จะกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณให้แสดงไฟล์แบบคงที่จากหลายเส้นทาง .

URL แบบต่อเนื่องกับManifestStaticFilesStorage

หมายเหตุเกี่ยวกับกัญชา MD5 ถูกผนวกเข้ากับชื่อไฟล์สำหรับเวอร์ชัน: มันไม่ได้เป็นส่วนหนึ่งของการทำงานเริ่มต้นของการcollectstaticเป็นsettings.STATICFILES_STORAGEค่าเริ่มต้นStaticFilesStorage(ซึ่งไม่ได้ทำอย่างนั้น)

แฮช MD5 จะเริ่มใช้เช่นหากคุณตั้งค่าให้ใช้ManifestStaticFilesStorageซึ่งโฆษณานั้นจะทำงาน

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


3
คุณต้องการที่จะบอกว่ามันจะง่ายสำหรับการค้นหาเว็บเซิร์ฟเวอร์เพื่อให้บริการเนื้อหาคงที่
babygame0ver

45

ไฟล์คงที่ Django สามารถอยู่ได้หลายที่ แฟ้มที่ทำหน้าที่เป็น/static/img/icon.pngอาจจะมาจากหลายสถานที่ โดยค่าเริ่มต้น:

  • FileSystemFinderจะมองหาimg/icon.pngในแต่ละSTATICFILES_DIRS,
  • AppDirectoriesFinderจะค้นหาimg/icon.pngในstaticโฟลเดอร์ย่อยในแต่ละINSTALLED_APPSไฟล์. สิ่งนี้ช่วยให้ไลบรารีเช่น Django Admin สามารถเพิ่มไฟล์คงที่ของตนเองลงในแอปของคุณได้

ตอนนี้: ใช้งานได้เฉพาะเมื่อคุณรันmanage.py runserverด้วย DEBUG = 1 เมื่อคุณถ่ายทอดสดกระบวนการ Django จะไม่ให้บริการเนื้อหาคงที่อีกต่อไป มันจะไม่มีประสิทธิภาพที่จะใช้ Django เพื่อให้บริการเหล่านี้มีเครื่องมือพิเศษเฉพาะสำหรับสิ่งนั้น

คุณควรทำสิ่งนี้แทน:

  • ค้นหาไฟล์คงที่ทั้งหมดจากทุกแอพ
  • สร้างไดเร็กทอรีเดียวที่มีทั้งหมด
  • อัปโหลดที่ใดที่หนึ่ง ( staticไดเรกทอรีที่อยู่บนเว็บเซิร์ฟเวอร์ของคุณหรือที่เก็บไฟล์ของบุคคลที่สาม)
  • กำหนดค่าเว็บเซิร์ฟเวอร์ของคุณ (เช่น nginx) เพื่อให้บริการ/static/*โดยตรงจากไดเร็กทอรีนั้นและเปลี่ยนเส้นทางคำขออื่น ๆ ไปยัง Django

collectstatic เป็นสคริปต์สำเร็จรูปที่จัดเตรียมไดเร็กทอรีนี้ให้คุณเพื่อให้คุณสามารถเชื่อมต่อโดยตรงกับสคริปต์การปรับใช้ของคุณ


25

ในการติดตั้งที่ใช้งานจริงคุณต้องการมี URL ที่คงอยู่ URL จะไม่เปลี่ยนแปลงจนกว่าเนื้อหาของไฟล์จะเปลี่ยนไป

เป็นการป้องกันไม่ให้ไคลเอ็นต์มีไฟล์ CSS หรือ JS ผิดเวอร์ชันบนคอมพิวเตอร์เมื่อเปิดหน้าเว็บจาก Django Django staticfiles ตรวจจับการเปลี่ยนแปลงของไฟล์และอัปเดต URL ตามนั้นดังนั้นหากไฟล์ CSS หรือ JS เปลี่ยนเว็บเบราว์เซอร์จะดาวน์โหลดเวอร์ชันใหม่

โดยปกติจะทำได้โดยการเพิ่มแฮช MD5 ในชื่อไฟล์ระหว่างการcollectstaticรัน

แก้ไข: ดูคำตอบที่เกี่ยวข้องกับหลายแอพ


1
สิ่งที่ดี! ไม่รู้
บริจาค

"มักทำได้โดยการเพิ่มแฮช MD5" คุณหมายถึงManifestStaticFilesStorage ? ดีฉันไม่ได้เห็นมัน
Kos

3
ฉันคิดว่าโดยค่าเริ่มต้นจะไม่มีการแฮช MD5 เกิดขึ้นเนื่องจากsettings.STATICFILES_STORAGEค่าเริ่มต้นเป็นStaticFilesStorageดังนั้น MD5 จะเริ่มทำงานหลังจากที่คุณตั้งค่าเป็นManifestStaticFilesStorageฉันถูกต้องหรือไม่
Bakkal

@MikkoOhtamaa แต่แอพ frontend จะรู้ได้อย่างไรว่าควรจะลิงค์ชื่อไฟล์ไหนเนื่องจากหลังเปลี่ยนไปเสมอ?
lapin

@lapin คำถามดีๆ! โดยปกติจะต้องมีอยู่ 1) การแมปกับเวอร์ชันล่าสุดและ 2) วิธีสื่อสารสิ่งนี้ โดยปกติจะถูกเก็บไว้ในไฟล์ที่ใดที่หนึ่งจากนั้นเมื่อคุณถามว่า "URL แบบเต็มสำหรับ X เวอร์ชันล่าสุดใด" จะให้ผลลัพธ์
Mikko Ohtamaa

10

จะมีประโยชน์เมื่อมีแอพ django หลายตัวในไซต์

collectstatic จากนั้นจะรวบรวมไฟล์แบบคงที่จากแอปทั้งหมดในที่เดียวเพื่อให้สามารถใช้งานได้ในสภาพแวดล้อมการใช้งานจริง

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