Django:“ โปรเจ็กต์” เทียบกับ“ แอพ”


202

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

โครงการสามารถมีแอพมากมาย สามารถแชร์แอพได้ในหลายโครงการ ละเอียด.

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

ถ้าเป็นเช่นนั้น ... ในแง่ของproject.appเนมสเปซของ Django ความชอบของฉันคือการใช้myproduct.myproductแต่แน่นอนว่านี่ไม่ได้รับอนุญาต (แต่แอปพลิเคชันที่ฉันสร้างคือโครงการของฉันและโครงการของฉันเป็นแอปพลิเคชั่น!) ฉันจึงเชื่อว่าบางทีฉันควรเข้าใกล้ Django ด้วยการสร้างแอปหนึ่งตัวต่อโมเดล "สำคัญ" แต่ฉันไม่รู้ว่าจะวาดขอบเขตในสคีมาของฉันเพื่อแยกมันออกเป็นแอพได้อย่างไร - ฉันมีจำนวนมาก โมเดลที่มีความสัมพันธ์ค่อนข้างซับซ้อน

ฉันหวังว่าจะมีวิธีแก้ปัญหาทั่วไปสำหรับเรื่องนี้ ...


1
เอกสารอธิบายความแตกต่างระหว่าง "แอปพลิเคชัน" และ "โครงการ" ที่นี่: docs.djangoproject.com/en/dev/ref/applications/…
guettli

คำตอบ:


56

จะหยุดคุณใช้myproduct.myproductอะไร สิ่งที่คุณต้องทำให้สำเร็จโดยคร่าวๆประกอบด้วยการทำสิ่งนี้:

django-admin.py startproject myproduct
cd myproduct
mkdir myproduct
touch myproduct/__init__.py
touch myproduct/models.py
touch myproduct/views.py

และอื่น ๆ มันจะช่วยได้ไหมถ้าฉันบอกว่าviews.pyไม่ต้องโทรหาviews.py? ให้คุณสามารถตั้งชื่อบนเส้นทางหลาม, ฟังก์ชั่น (มักจะ package.package.views.function_name) มันจะได้รับการจัดการ เรียบง่ายเหมือนที่ สิ่งที่ "project" / "app" ทั้งหมดนี้เป็นเพียงแพ็คเกจงูใหญ่

ตอนนี้คุณควรจะทำอย่างไร หรือค่อนข้างฉันจะทำอย่างไร ดีถ้าคุณสร้างชิ้นส่วนที่สำคัญของการทำงานที่นำมาใช้ใหม่เช่นพูดบรรณาธิการมาร์กอัปที่เมื่อคุณสร้าง app "บนระดับ" ซึ่งอาจมีwidgets.py, fields.py, context_processors.pyฯลฯ - ทุกสิ่งที่คุณอาจต้องการที่จะนำเข้า

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

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

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

  • การตั้งค่าเริ่มต้นของ Django ไม่ได้ทำ
  • บ่อยครั้งที่ผมต้องการที่จะสร้าง app websiteหลักดังนั้นฉันสร้างมักจะเรียกว่า อย่างไรก็ตามในภายหลังฉันอาจต้องการพัฒนาฟังก์ชั่นดั้งเดิมสำหรับเว็บไซต์นี้เท่านั้น ด้วยมุมมองที่ทำให้สามารถถอดออกได้ (ไม่ว่าฉันจะเคยทำหรือไม่) ฉันมักจะสร้างไดเรกทอรีแยกต่างหาก นอกจากนี้ยังหมายความว่าฉันสามารถวางฟังก์ชั่นการพูดเพียงแค่ยกเลิกการเชื่อมโยงแพ็คเกจนั้นจากการกำหนดค่าและการลบโฟลเดอร์แทนที่จะซับซ้อนลบ URL ที่เหมาะสมจากโฟลเดอร์ urls.py ทั่วโลก
  • บ่อยครั้งที่ฉันต้องการทำบางสิ่งบางอย่างให้เป็นอิสระมันต้องอาศัยอยู่ที่ไหนสักแห่งในขณะที่ฉันดูแล / ทำให้เป็นอิสระ โดยทั่วไปกรณีข้างต้น แต่สำหรับสิ่งที่ฉันตั้งใจจะทำทั่วไป
  • โฟลเดอร์ระดับบนสุดของฉันมักมีสิ่งอื่น ๆ อยู่รวมถึง แต่ไม่ จำกัด เพียงสคริปต์ wsgi, สคริปต์ sql เป็นต้น
  • นามสกุลการจัดการของ django พึ่งพาไดเรกทอรีย่อย ดังนั้นจึงเหมาะสมที่จะตั้งชื่อแพ็คเกจอย่างเหมาะสม

ในระยะสั้นเหตุผลที่มีการประชุมเหมือนกับการประชุมอื่น ๆ - มันช่วยเมื่อมันมาถึงคนอื่นที่ทำงานกับโครงการของคุณ ถ้าฉันเห็นfields.pyฉันคาดหวังรหัสทันทีในฟิลด์คลาสย่อย django ในขณะที่ถ้าฉันเห็นinputtypes.pyฉันอาจไม่ชัดเจนในสิ่งที่หมายถึงโดยไม่ได้ดู


24
+1 ... "อะไรที่ทำให้คุณหยุดใช้ผลิตภัณฑ์ myproduct.my" - คำสั่ง "startapp" ของ Django หยุดคุณจริงๆแล้วฉันถือว่าเป็นแบบแผน ผมชอบการประชุมโดยเฉพาะอย่างยิ่งในบริบทของความพยายามของทีม แต่ผมต้องการที่จะเข้าใจตรรกะอยู่เบื้องหลังพวกเขา :)
ดอล์ฟ

@ Dolph ah ใช่ไหม ฉันไม่ได้ใช้มาตั้งแต่ครั้งแรกที่ใช้เพราะฉันมีคำสั่งของตัวเองสำหรับการสร้างโครงการที่สร้างแบบจำลองก่อนจากนั้นสร้างสิ่ง CRUD โดยอัตโนมัติสำหรับแบบจำลองเหล่านี้ ยังใช่การประชุมที่ดี ฉันทำตามการประชุม django ถ้าเพียงเพราะพูดส่วนใหญ่พวกเขาทำให้รู้สึก

1
ฉันจะเพิ่มที่ใช้ชื่อเดียวกันสำหรับโครงการและแอปภายในทำให้เกิดปัญหาด้วยmanage.pyทำให้ไม่สามารถนำเข้าการตั้งค่าโครงการของคุณได้อย่างถูกต้อง นี้เกิดขึ้นกับฉันและฉันจะแก้ไขได้โดย refactoring app myproduct_appเพื่อผลของการ
BHSPitMonkey

89

เมื่อคุณเปลี่ยนจากการใช้startprojectและstartappไม่มีอะไรจะหยุดคุณจากการรวม "โครงการ" และ "แอพ" ในแพ็คเกจ Python เดียวกัน โครงการไม่มีอะไรมากไปกว่าsettingsโมดูลและแอพไม่มีอะไรมากไปกว่าmodelsโมดูล - ทุกอย่างเป็นทางเลือก

สำหรับไซต์ขนาดเล็กมันสมเหตุสมผลอย่างยิ่งที่จะมีสิ่งต่อไปนี้:

site/
    models.py
    settings.py
    tests.py
    urls.py
    views.py

18
สรุป +1: โครงการมี settings.py แอพมี models.py พวกมันเป็นโครงสร้างระดับเดียวกัน ฉันเคยคิดว่าโปรเจ็กต์นั้นสูงกว่าแอปหนึ่งระดับเดาว่าฉันผิด
Philip007

2
@claymation สิ่งที่ควรรวมอยู่ในการตั้งค่า (เป็นแอพ) เพื่ออนุญาตให้ 'python Manage.py makemigrations' หรือ 'python Manage.py โอนย้าย' เพื่อดูไฟล์ 'models.py' ในไดเรกทอรี 'ผลิตภัณฑ์ของฉัน'
mlwn

1
@mlwn ฉันรู้ว่าฉันช้าที่จะตอบคำถามนี้ แต่ฉันอยู่ในสถานการณ์ที่คล้ายกันตัวเองและฉันได้ดูคำตอบมากมาย ในการตอบคำถามของคุณสิ่งที่คุณต้องทำคือรวมโครงการของคุณไว้ในINSTALLED_APPSรายการ นี่คือตัวอย่าง: stackoverflow.com/a/59739912/399435
Karthic Raghupathi

@KarthicRaghupathi ขอบคุณ .. :) ยินดีที่ได้เห็นความคิดเห็นตอบหลังจากสี่ปี .. ไชโย
mlwn

69

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

ฉันอ่านความคิดนี้ที่ไหนสักแห่งหลังจากฉันเริ่มทำงานกับ django และฉันพบว่าฉันถามคำถามตัวเองบ่อยๆและมันช่วยฉันได้

แอพของคุณไม่จำเป็นต้องนำมาใช้ซ้ำได้พวกเขาสามารถพึ่งพาซึ่งกันและกันได้ แต่ควรทำสิ่งหนึ่ง


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

15

ฉันพบบล็อกโพสต์ต่อไปนี้มีประโยชน์มากเกี่ยวกับแอปพลิเคชันและโครงการ django:

โดยหลักการแล้วคุณมีอิสระมากมายกับ django สำหรับจัดระเบียบซอร์สโค้ดของผลิตภัณฑ์ของคุณ


8

ถ้าเป็นเช่นนั้น ... ในแง่ของ project.app ของ Django namespace ความชอบของฉันคือ usemyproduct.myproduct แต่แน่นอนว่าสิ่งนี้ไม่ได้รับอนุญาต

ไม่มีอะไรเหมือนที่ไม่ได้รับอนุญาต มันเป็นโครงการของคุณไม่มีใคร จำกัด คุณ ขอแนะนำให้เก็บชื่อที่เหมาะสม

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

ในโครงการ django ทั่วไปมีแอพมากมาย (แอพ contrib) ที่ใช้จริงในทุกโปรเจ็กต์

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

ตอนนี้ถ้าคุณบอกว่าโปรเจคของคุณใช้เพียงแอพเดียว ( INSTALLED_APPS='myproduct') ดังนั้นการใช้projectการกำหนดโปรเจคเป็นproject.appอย่างไรฉันคิดว่าคุณควรพิจารณาบางประเด็น:

  • มีสิ่งอื่น ๆ อีกมากมายที่รหัสนอกเหนือจากแอปในการจัดการโครงการ (ไฟล์ฐานคงที่, แม่แบบฐาน, การตั้งค่า .... คือให้ฐาน)
  • ในแนวทางทั่วไป project.app django จะกำหนด sql schema จากแบบจำลองโดยอัตโนมัติ
  • โครงการของคุณจะง่ายต่อการสร้างด้วยวิธีการทั่วไป
  • คุณอาจกำหนดชื่อที่แตกต่างกันบางอย่างสำหรับ URL มุมมองและไฟล์อื่น ๆ ตามที่คุณต้องการ แต่ฉันไม่เห็นความต้องการ
  • คุณอาจจำเป็นต้องเพิ่มแอปพลิเคชั่นบางอย่างในอนาคตซึ่งจะเป็นเรื่องง่ายกับโครงการ django แบบดั้งเดิมซึ่งไม่เช่นนั้นอาจจะยากหรือน่าเบื่อเท่ากันและน่าเบื่อ

เท่าที่งานส่วนใหญ่ที่ทำในแอพเกี่ยวข้องผมคิดว่าเป็นกรณีของโครงการ django ส่วนใหญ่


1
+1, โดยเฉพาะสำหรับการmainประชุม - นั่นสมเหตุสมผลสำหรับฉันสำหรับโครงการดั้งเดิมเช่นนี้ ฉันวางแผนที่จะเพิ่มแอป "ที่ใช้ซ้ำได้" ในภายหลัง แต่นั่นเป็นวิธีที่นอกเหนือการโฟกัสของฉันในตอนนี้
Dolph

2

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

ลองนึกภาพว่าคุณกำลังสร้างใหญ่ แบบไดนามิกเว็บเบสแอปในJavaScript

คุณสามารถสร้างในแอพ django ชื่อเช่น "FrontEnd" <- ในแอพที่คุณจะแสดงเนื้อหา

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

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

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