Django: các dự án của Cameron


202

Tôi có một "sản phẩm" khá phức tạp Tôi đang chuẩn bị xây dựng bằng Django. Tôi sẽ tránh sử dụng thuật ngữ "dự án" và "ứng dụng" trong ngữ cảnh này, vì tôi không rõ ý nghĩa cụ thể của chúng trong Django.

Các dự án có thể có nhiều ứng dụng. Ứng dụng có thể được chia sẻ giữa nhiều dự án. Khỏe.

Tôi không phát minh lại blog hoặc diễn đàn - Tôi không thấy bất kỳ phần nào của sản phẩm của tôi có thể được sử dụng lại trong bất kỳ bối cảnh nào. Theo trực giác, tôi sẽ gọi đây là "ứng dụng". Sau đó tôi có làm tất cả công việc của mình trong một thư mục "ứng dụng" không?

Nếu vậy ... về mặt project.appkhông gian tên của Django , thiên hướng của tôi là sử dụng myproduct.myproduct, nhưng tất nhiên điều này không được phép (nhưng ứng dụng tôi đang xây dựng là dự án của tôi và dự án của tôi là một ứng dụng!). Do đó, tôi tin rằng có lẽ tôi nên tiếp cận Django bằng cách xây dựng một ứng dụng theo mô hình "đáng kể", nhưng tôi không biết nên vẽ ranh giới trong lược đồ của mình để tách nó thành ứng dụng - Tôi có rất nhiều của các mô hình với các mối quan hệ tương đối phức tạp.

Tôi hy vọng có một giải pháp chung cho việc này ...


1
Các tài liệu giải thích sự khác biệt giữa "ứng dụng" và "dự án" tại đây: docs.djangoproject.com/en/dev/ref/appluggest/ Lỗi
guettli

Câu trả lời:


56

Điều gì là ngăn bạn sử dụng myproduct.myproduct? Những gì bạn cần để đạt được điều đó bao gồm làm điều này:

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

và như thế. Nó có giúp ích gì không nếu tôi nói views.pykhông cần phải gọi views.py? Với điều kiện bạn có thể đặt tên, trên đường dẫn python, một hàm (thường là pack.package.view.feft_name) nó sẽ được xử lý. Đơn giản như vậy. Tất cả những thứ "dự án" / "ứng dụng" này chỉ là các gói python.

Bây giờ, làm thế nào bạn có nghĩa vụ phải làm điều đó? Hay đúng hơn, làm thế nào tôi có thể làm điều đó? Vâng, nếu bạn tạo ra một mảnh quan trọng của chức năng tái sử dụng, như nói một trình soạn thảo đánh dấu, đó là khi bạn tạo ra một "ứng dụng cấp cao nhất" mà có thể chứa widgets.py, fields.py, context_processors.pyvv - tất cả mọi thứ bạn có thể muốn nhập khẩu.

Tương tự, nếu bạn có thể tạo một cái gì đó giống như một blog ở định dạng khá chung chung trong các cài đặt, bạn có thể gói nó trong một ứng dụng, với mẫu riêng, thư mục nội dung tĩnh, v.v. và định cấu hình phiên bản của dự án django để sử dụng nội dung của ứng dụng.

Không có quy tắc cứng và nhanh nào nói rằng bạn phải làm điều này, nhưng đó là một trong những mục tiêu của khung. Thực tế là tất cả mọi thứ, các mẫu được bao gồm, cho phép bạn đưa vào từ một số cơ sở chung có nghĩa là blog của bạn sẽ phù hợp với bất kỳ thiết lập nào khác, chỉ đơn giản bằng cách chăm sóc phần riêng của nó.

Tuy nhiên, để giải quyết mối quan tâm thực sự của bạn, vâng, không có gì nói rằng bạn không thể làm việc với thư mục dự án cấp cao nhất. Đó là những gì ứng dụng làm và bạn có thể làm điều đó nếu bạn thực sự muốn. Tôi có xu hướng không, tuy nhiên, vì một số lý do:

  • Thiết lập mặc định của Django không làm điều đó.
  • Thông thường, tôi muốn tạo một ứng dụng chính, vì vậy tôi tạo một ứng dụng, thường được gọi là website. Tuy nhiên, vào một ngày sau tôi có thể muốn phát triển chức năng ban đầu chỉ cho trang web này. Với quan điểm làm cho nó có thể tháo rời (dù tôi có làm hay không) tôi có xu hướng tạo một thư mục riêng. Điều này cũng có nghĩa là tôi có thể loại bỏ chức năng đã nói chỉ bằng cách hủy liên kết gói đó khỏi cấu hình và xóa thư mục, thay vì xóa phức tạp các url bên phải khỏi thư mục url toàn cầu.
  • Rất thường xuyên, ngay cả khi tôi muốn làm cho một cái gì đó độc lập, nó cần một nơi nào đó để sống trong khi tôi chăm sóc nó / làm cho nó độc lập. Về cơ bản là trường hợp trên, nhưng đối với những thứ tôi có ý định làm chung.
  • Thư mục cấp cao nhất của tôi thường chứa một vài thứ khác, bao gồm nhưng không giới hạn ở các tập lệnh wsgi, tập lệnh sql, v.v.
  • phần mở rộng quản lý của django dựa vào thư mục con. Vì vậy, nó có ý nghĩa để đặt tên gói một cách thích hợp.

Nói tóm lại, lý do có một quy ước cũng giống như bất kỳ quy ước nào khác - nó giúp ích khi nói đến những người khác làm việc với dự án của bạn. Nếu tôi thấy fields.pytôi ngay lập tức mong đợi mã trong trường đó để phân lớp trường django, trong khi nếu tôi thấy inputtypes.pytôi có thể không rõ ràng về điều đó có nghĩa là gì nếu không nhìn vào nó.


24
+1 ... "Điều gì ngăn bạn sử dụng myproduct.myproduct?" - Lệnh "startapp" của Django thực sự ngăn bạn, tôi cho rằng, như một quy ước. Tôi thích các quy ước, đặc biệt là trong bối cảnh nỗ lực của nhóm, nhưng tôi thích hiểu logic đằng sau chúng :)
Dolph

@Dolph ah, phải không? Tôi đã không sử dụng nó kể từ lần đầu tiên tôi sử dụng nó bởi vì tôi có lệnh riêng để tạo một dự án đầu tiên tạo các mô hình sau đó tự động tạo công cụ CRUD cho các mô hình này. Tuy nhiên, có quy ước là tốt. Tôi theo các quy ước django nếu chỉ vì phần lớn nói chúng có ý nghĩa.

1
Tôi sẽ thêm rằng việc sử dụng cùng tên cho một dự án và một ứng dụng trong đó cũng gây ra sự cố với manage.pynó, khiến nó không thể nhập chính xác các cài đặt dự án của bạn. Điều này đã xảy ra với tôi và tôi đã giải quyết nó bằng cách cấu trúc lại ứng dụng theo hiệu quả của myproduct_app.
BHSPitMonkey

89

Khi bạn tốt nghiệp sử dụng startprojectstartapp, không có gì ngăn bạn kết hợp một "dự án" và "ứng dụng" trong cùng một gói Python. Một dự án thực sự không có gì nhiều hơn một settingsmô-đun, và một ứng dụng thực sự không có gì hơn một modelsmô-đun, mọi thứ khác là tùy chọn.

Đối với các trang web nhỏ, việc có một cái gì đó như:

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

18
Tóm tắt +1: dự án có settings.py, ứng dụng có mô hình. Chúng là cấu trúc cấp giống nhau. Tôi đã từng nghĩ dự án cao hơn một cấp so với ứng dụng, đoán tôi đã sai
Philip007

2
@claymation, những gì cần được bao gồm trong cài đặt (dưới dạng ứng dụng) để cho phép 'python Manage.py makemigations' hoặc 'python Manage.py di chuyển' để xem tệp 'model.py' trong thư mục 'sản phẩm của tôi'?
mlwn

1
@mlwn Tôi nhận ra mình siêu muộn khi trả lời câu hỏi này nhưng bản thân tôi cũng gặp tình huống tương tự và tôi đã xem xét rất nhiều câu trả lời. Để trả lời câu hỏi của bạn, tất cả những gì bạn cần làm là đưa dự án của bạn vào INSTALLED_APPSdanh sách. Dưới đây là một ví dụ: stackoverflow.com/a/59739912/399435
Karthic Raghupathi

@KarthicRaghupathi, Cảm ơn .. :) Rất vui khi thấy các bình luận được trả lời sau bốn năm .. chúc mừng
mlwn

69

Hãy thử trả lời câu hỏi: "Ứng dụng của tôi làm gì?". Nếu bạn không thể trả lời trong một câu, thì có lẽ bạn có thể chia nó thành nhiều ứng dụng với logic sạch hơn.

Tôi đã đọc được suy nghĩ này ở đâu đó ngay sau khi tôi bắt đầu làm việc với django và tôi thấy rằng tôi hỏi câu hỏi này của bản thân khá thường xuyên và nó giúp tôi.

Các ứng dụng của bạn không phải sử dụng lại, chúng có thể phụ thuộc lẫn nhau, nhưng chúng nên làm một việc.


8
Tôi vẫn đang vật lộn một chút khi đưa ra ứng dụng của riêng mình. Tôi cảm thấy như ứng dụng chính của mình hơi nặng nề, nhưng đồng thời, tôi sẽ không thể cấu trúc lại nó thành bất cứ thứ gì gần giống với thứ gì đó được ghép lỏng lẻo. Tôi nghiêng về suy nghĩ rằng sẽ không thực sự là một cải tiến để tách các thực thể chính của tôi, nếu chúng vẫn phụ thuộc nhiều vào nhau, và không cần phải sử dụng lại hoặc khái quát hóa trên đường chân trời. Tôi đang nghiêng về "không tái cấu trúc sớm" như một cách giải thích "không tối ưu hóa sớm"
acjay


8

Nếu vậy ... về mặt không gian tên project.app của Django, thiên hướng của tôi là usemyproduct.myproduct, nhưng tất nhiên điều này không được phép

Không có gì như không được phép. Đó là dự án của bạn, không ai hạn chế bạn. Đó là khuyến khích để giữ một tên hợp lý.

Tôi không thấy bất kỳ phần nào của sản phẩm của tôi có thể tái sử dụng trong bất kỳ bối cảnh nào. Theo trực giác, tôi sẽ gọi đây là "ứng dụng". Sau đó tôi có làm tất cả công việc của mình trong một thư mục "ứng dụng" không?

Trong một dự án django nói chung, có nhiều ứng dụng (ứng dụng đóng góp) được sử dụng thực sự trong mọi dự án.

Hãy để chúng tôi nói rằng dự án của bạn chỉ thực hiện một nhiệm vụ và chỉ có một ứng dụng duy nhất (tôi đặt tên cho nó mainlà dự án xoay quanh nó và hầu như không thể cắm được). Dự án này vẫn còn sử dụng một số ứng dụng khác nói chung.

Bây giờ nếu bạn nói rằng dự án của bạn chỉ sử dụng một ứng dụng ( INSTALLED_APPS='myproduct') vậy thì việc sử dụng projectđịnh nghĩa dự án là gì project.app, tôi nghĩ bạn nên xem xét một số điểm:

  • Có nhiều thứ khác mà mã không phải là ứng dụng trong dự án xử lý (tệp tĩnh cơ sở, mẫu cơ sở, cài đặt .... tức là cung cấp cơ sở).
  • Trong cách tiếp cận project.app chung, django tự động định nghĩa lược đồ sql từ các mô hình.
  • Dự án của bạn sẽ dễ dàng hơn nhiều để được xây dựng theo cách tiếp cận thông thường.
  • Bạn có thể xác định một số tên khác nhau cho các url, chế độ xem và các tệp khác theo ý muốn, nhưng tôi không thấy sự cần thiết.
  • Bạn có thể cần phải thêm một số ứng dụng trong tương lai, điều này thực sự dễ dàng với các dự án django thông thường mà nếu không nó có thể trở nên khó khăn hoặc khó khăn hơn và khó thực hiện hơn.

Theo như hầu hết các công việc đang được thực hiện trong ứng dụng có liên quan, tôi nghĩ đó là trường hợp của hầu hết các dự án django.


1
+1, đặc biệt cho mainhội nghị - điều đó rất có ý nghĩa với tôi cho một dự án ban đầu như thế này. Tôi có kế hoạch thêm các ứng dụng "có thể tái sử dụng" sau, nhưng đó là cách tôi không tập trung ngay bây giờ.
Dolph

2

Ở đây những người sáng tạo Django chỉ ra sự khác biệt đó . Tôi nghĩ rằng suy nghĩ về Ứng dụng vì chúng phải được sử dụng lại trong các dự án khác là tốt . Cũng là một cách nghĩ tốt về Ứng dụng trong Django cung cấp các ứng dụng web hiện đại.

Hãy tưởng tượng rằng bạn đang tạo ứng dụng web động lớn dựa trên JavaScript .

Sau đó, bạn có thể tạo trong ứng dụng django có tên ví dụ "FrontEnd" <- trong ứng dụng này, bạn sẽ hiển thị nội dung.

Sau đó, bạn tạo một số Ứng dụng phụ trợ. Ví dụ: Ứng dụng có tên "Nhận xét" sẽ lưu trữ bình luận của người dùng. Và ứng dụng "Nhận xét" sẽ không hiển thị bất cứ thứ gì. Nó sẽ chỉ là API cho các yêu cầu AJAX của trang web JS động của bạn .

Bằng cách này, bạn luôn có thể sử dụng lại ứng dụng "Nhận xét" của mình. Bạn có thể làm cho nó nguồn mở mà không cần mở nguồn của toàn bộ dự án. Và bạn giữ logic sạch của dự án của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.