จะสร้างแอปใหม่ (พร้อม startapp) ใน Django เมื่อใด


107

ฉันเข้าใจเรื่องนี้แล้ว แต่ยังมีปัญหาเกี่ยวกับสิ่งที่ Django ให้คำจำกัดความว่า "แอป"

ฉันควรสร้างแอปใหม่สำหรับฟังก์ชันแต่ละส่วนในไซต์แม้ว่าจะใช้โมเดลจากโปรเจ็กต์หลัก

พวกคุณมีหลักเกณฑ์ที่ดีว่าจะแยกแอปใหม่เมื่อใดและเมื่อใดควรใช้ฟังก์ชันร่วมกับ "โครงการหลัก" หรือแอปอื่น ๆ

คำตอบ:


44

James Bennett มีชุดสไลด์ที่ยอดเยี่ยมเกี่ยวกับวิธีจัดระเบียบแอปที่ใช้ซ้ำได้ใน Django


1
หมายความว่าถ้าจะสร้างโมเดลลูกต้องอยู่ในแอปเดียวกันเสมอไปใช่หรือไม่? เนื่องจากฉันไม่สามารถวางลงในโปรเจ็กต์อื่นได้อย่างง่ายดายโดยไม่นำ "แอป" สองตัวมา
Lionel

19

ฉันชอบคิดว่าแอปพลิเคชัน Django เป็นโมดูลหรือส่วนประกอบที่ใช้ซ้ำได้มากกว่า "แอปพลิเคชัน"

สิ่งนี้ช่วยให้ฉันห่อหุ้มและแยกคุณสมบัติบางอย่างออกจากกันการปรับปรุงการใช้งานซ้ำฉันควรตัดสินใจที่จะแชร์ "แอป" เฉพาะกับชุมชนโดยรวมและการบำรุงรักษา

วิธีการทั่วไปของฉันคือการรวบรวมคุณลักษณะเฉพาะหรือคุณลักษณะที่กำหนดไว้ใน "แอป" ราวกับว่าฉันกำลังจะเผยแพร่ต่อสาธารณะ ส่วนที่ยากคือการหาว่าถังแต่ละใบใหญ่แค่ไหน

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


16

นี่คืองานนำเสนอที่ปรับปรุงเมื่อวันที่ 6 กันยายน 2551

DjangoCon 2008: แอพที่ใช้ซ้ำได้ @ 7:53

สไลด์: Reusable_apps.pdf

นำมาจากสไลด์

นี่ควรเป็นแอปพลิเคชันของตัวเองหรือไม่?

  • มันไม่เกี่ยวข้องกับโฟกัสของแอพเลยหรือ?
  • มันตั้งฉากกับสิ่งอื่นที่ฉันกำลังทำอยู่หรือเปล่า?
  • ฉันต้องการฟังก์ชันที่คล้ายกันในไซต์อื่นหรือไม่?

หากมีข้อใด "ใช่"? จากนั้นให้แยกเป็นแอปพลิเคชันแยกต่างหาก


สไลด์ที่ฉันเห็นไม่มีคำถามแรกเกี่ยวกับ "โฟกัสของแอป"
จอห์นนี่

@johnny อยู่ที่สไลด์ 31 จาก 99.
Yeo

13

ฉันมักจะสร้างแอปพลิเคชันใหม่สำหรับชุดโมเดลที่แยกจากกันอย่างมีเหตุผล เช่น:

  • โปรไฟล์ผู้ใช้
  • กระทู้สนทนา
  • โพสต์บล็อก

6

กฎที่ฉันปฏิบัติตามคือควรเป็นแอปใหม่หากฉันต้องการใช้ฟังก์ชันนี้ซ้ำในโครงการอื่น

หากต้องการความเข้าใจอย่างลึกซึ้งเกี่ยวกับแบบจำลองในโครงการของคุณการยึดติดกับแบบจำลองอาจมีความเหนียวแน่นมากกว่า


4

คำตอบที่ดีที่สุดสองข้อสำหรับคำถามนี้ที่ฉันพบในเว็บคือ:

  1. Apps Talk ที่ใช้ซ้ำได้ ( สไลด์ ) ( วิดีโอ ) ยังกล่าวถึงในคำตอบอื่น ๆ Bennett ผู้เขียนและผู้สนับสนุน Django เผยแพร่แอปให้ผู้อื่นใช้เป็นประจำและมีมุมมองที่ชัดเจนต่อแอปขนาดเล็กจำนวนมาก
  2. เคล็ดลับสำหรับ Django at Scale ของ Doordashซึ่งให้คำแนะนำที่ตรงกันข้ามและกล่าวว่าในกรณีของพวกเขาพวกเขาย้ายไปยังแอพเดียวหลังจากเริ่มต้นด้วยแอพแยกกันมากมาย พวกเขาประสบปัญหาเกี่ยวกับกราฟการอ้างอิงการย้ายข้อมูลระหว่างแอป

แหล่งที่มาทั้งสองยอมรับว่าคุณควรสร้างแอปแยกต่างหากในสถานการณ์ต่อไปนี้:

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

1

'แอป' อาจเป็นสิ่งที่แตกต่างกันได้ทุกอย่างมีไว้เพื่อลิ้มรส ตัวอย่างเช่นสมมติว่าคุณกำลังสร้างบล็อก แอปของคุณอาจเป็นทั้งบล็อกหรือคุณอาจมีแอป "ผู้ดูแลระบบ" แอป "ไซต์" สำหรับมุมมองสาธารณะทั้งหมดแอป "rss" แอป "บริการ" เพื่อให้นักพัฒนาสามารถเชื่อมต่อกับบล็อกใน แนวทางของตัวเอง ฯลฯ

โดยส่วนตัวฉันจะทำให้บล็อกเป็นแอปและแยกฟังก์ชันการทำงานภายในออก จากนั้นบล็อกสามารถใช้ซ้ำได้ค่อนข้างง่ายในเว็บไซต์อื่น ๆ

สิ่งที่ดีเกี่ยวกับ Django คือมันจะจดจำไฟล์ models.py ใด ๆ ภายในแผนผังไดเรกทอรีของคุณทุกระดับเป็นไฟล์ที่มีโมเดล Django ดังนั้นการแยกฟังก์ชันการทำงานของคุณออกเป็น 'แอปย่อย' ขนาดเล็กภายใน 'แอป' นั้นเองจะไม่ทำให้อะไรยากขึ้น


0

คำตอบที่ดีที่สุดสำหรับคำถามนี้ได้รับจาก Andrew Godwin (ผู้พัฒนาหลักของ Django):

จุดประสงค์หลักของแอพคือในสายตาของฉันเพื่อให้การแยกส่วนประกอบที่ใช้ซ้ำได้อย่างมีเหตุผลโดยเฉพาะอย่างยิ่งเนมสเปซชั้นหนึ่งสำหรับโมเดล / ผู้ดูแลระบบ / ฯลฯ - และเพื่อเป็นวิธีง่ายๆในการ "เปิด" หรือ "ปิด"

ในบางวิธีมันเป็นของที่ระลึกในช่วงเวลาที่ Django ถูกสร้างขึ้น - เมื่อบรรจุภัณฑ์และโมดูล Python ได้รับการพัฒนาน้อยกว่ามากและโดยพื้นฐานแล้วคุณต้องมีวิธีแก้ปัญหาของคุณเอง ที่กล่าวว่ามันยังคงเป็นส่วนหลักของแบบจำลองทางจิตของ Django และฉันคิดว่า INSTALLED_APPS ยังคงเป็นวิธีแก้ปัญหาที่สะอาดและง่ายกว่าการเสนอจุดเข้าใช้แทนของ Python (ซึ่งทำให้ยากที่จะปิดใช้งานแพ็คเกจที่ติดตั้งในสภาพแวดล้อม แต่คุณไม่ได้ใช้ ไม่ต้องการใช้)

มีอะไรเป็นพิเศษที่คุณคิดว่าสามารถแยกออกจากแนวคิดของแอปในวันนี้ได้หรือไม่? โมเดลและผู้ดูแลระบบต้องการมันสำหรับการค้นหาอัตโนมัติและคำนำหน้าเนมสเปซที่ไม่ซ้ำใครดังนั้นจึงยากที่จะเลิกทำและฉันกำลังดิ้นรนที่จะคิดถึงคุณสมบัติอื่น ๆ ที่คุณต้องการ (อันที่จริงถ้าทั้งหมดที่คุณต้องการเป็นเพียงไลบรารีคุณสามารถทำได้ Python ปกติ - ไม่จำเป็นต้องห่อแอปเว้นแต่คุณจะจัดส่งโมเดลแม่แบบหรือรหัสผู้ดูแลระบบ IIRC)

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