장고 :“프로젝트”대“앱”


202

Django를 사용하여 빌드를 준비하는 상당히 복잡한 "제품"이 있습니다. Django의 특정 의미에 대해 명확하지 않기 때문에이 맥락에서 "프로젝트"와 "응용 프로그램"이라는 용어를 사용하지 마십시오.

프로젝트에는 많은 앱이있을 수 있습니다. 많은 프로젝트에서 앱을 공유 할 수 있습니다. 좋아.

블로그 나 포럼을 다시 만들지 않습니다. 어떤 맥락에서도 제품의 일부를 재사용 할 수 없습니다. 직관적으로, 나는 이것을 "응용 프로그램"이라고 부릅니다. 그런 다음 하나의 "app"폴더에서 모든 작업을 수행합니까?

그렇다면 ... Django의 project.app네임 스페이스 측면 에서 내 성향은을 사용하는 myproduct.myproduct것이지만 물론 이것은 허용되지 않습니다 (그러나 내가 만들고있는 응용 프로그램은 내 프로젝트이고 내 프로젝트는 응용 프로그램입니다!). 따라서 "중요한"모델 당 하나의 앱을 구축하여 Django에 접근해야한다고 생각하지만, 스키마에서 앱으로 분리하기 위해 스키마의 경계를 어디로 그릴 지 모르겠습니다. 비교적 복잡한 관계의 모델

나는 이것에 대한 일반적인 해결책이 있기를 바라고있다 ...


1
문서는 여기에서 "application"과 "project"의 차이점을 설명합니다. 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)의 이름을 지정할 수 있다면. 그렇게 간단합니다. 이 "프로젝트"/ "앱"은 모두 파이썬 패키지입니다.

이제 어떻게해야합니까? 아니면 어떻게 할 수 있습니까? 재사용 가능한 기능의 상당 부분을 작성하는 경우 뭐, 같은 당신이 "최고 수준의 응용 프로그램을"만들 때 포함 할 수있는 사용자들은, 마크 업 편집기 말 widgets.py, fields.py, context_processors.py모든 것을 가져올 수있다 - 등.

마찬가지로 설치 과정에서 매우 일반적인 형식으로 블로그와 같은 것을 만들 수있는 경우 자체 템플릿, 정적 콘텐츠 폴더 등을 사용하여 앱에서 블로그를 마무리하고 장고 프로젝트 인스턴스를 구성하여 사용할 수 있습니다 앱의 콘텐츠.

이 작업을 수행해야한다는 단단하고 빠른 규칙은 없지만 프레임 워크의 목표 중 하나입니다. 템플릿에 포함 된 모든 항목을 사용하면 공통 기반을 포함 할 수 있다는 사실만으로 블로그 자체 구성 요소를 살펴보면 블로그가 다른 설정에 꼭 맞아야합니다.

그러나 실제 관심사를 해결하기 위해 최상위 프로젝트 폴더로 작업 할 수 있다고 말하는 것은 없습니다. 그것이 바로 앱이하는 일 이며, 원한다면 할 수 있습니다. 그러나 여러 가지 이유로 나는하지 않는 경향이 있습니다.

  • 장고의 기본 설정은 그렇게하지 않습니다.
  • 종종 메인 앱을 만들고 싶어서 보통이라고하는 앱을 만듭니다 website. 그러나 나중에이 사이트를 위해 독창적 인 기능을 개발하고 싶을 수도 있습니다. 이동식인지 확인하기 위해 (내가 아니든간에) 별도의 디렉토리를 만드는 경향이 있습니다. 이것은 전역 urls.py 폴더에서 올바른 URL을 복잡하게 삭제하는 대신 구성에서 해당 패키지의 링크를 해제하고 폴더를 제거하여 해당 기능을 삭제할 수 있음을 의미합니다.
  • 아주 자주, 내가 독립적 인 것을 만들고 싶을 때조차도 그것을 돌보고 / 독립적으로 만드는 동안 살 곳이 필요합니다. 기본적으로 위의 경우이지만 물건을 위해 일반화하려고합니다.
  • 내 최상위 폴더에는 종종 wsgi 스크립트, sql 스크립트 등을 포함하여 몇 가지 다른 것들이 포함됩니다.
  • django의 관리 확장 기능 은 하위 디렉토리에 의존합니다. 따라서 패키지 이름을 적절하게 지정하는 것이 좋습니다.

요컨대, 컨벤션이 존재하는 이유는 다른 컨벤션과 동일합니다. 프로젝트를 작업하는 다른 사람들에게 도움이 될 때 도움이됩니다. 내가 볼 경우 fields.pydjango의 필드를 서브 클래스로 묶는 코드를 즉시 기대하지만, 그것을 보지 inputtypes.py않으면 그 의미가 무엇인지 명확하지 않을 수 있습니다.


24
+1 ... "myproduct.myproduct 사용을 중지하는 것은 무엇입니까?" -Django의 "startapp"명령은 실제로 사용자를 중지시킵니다. 나는 특히 팀 노력의 맥락에서 컨벤션을 좋아하지만 그 뒤에 논리를 이해하는 것을 선호합니다 :)
Dolph

@ 돌프 아? 처음 모델을 만든 다음이 모델의 CRUD 항목을 자동 생성하는 프로젝트를 만드는 자체 명령이 있기 때문에 처음 사용한 이후로 사용하지 않았습니다. 여전히 그렇습니다. 나는 대부분 말이 의미가 있기 때문에 장고 규칙을 따릅니다.

1
프로젝트와 앱에 동일한 이름을 사용하면에 문제가 manage.py발생하여 프로젝트 설정을 올바르게 가져올 수 없습니다. 이것은 나에게 일어 났고 앱을의 효과로 리팩토링하여 해결했습니다 myproduct_app.
BHSPitMonkey

89

사용 졸업 후 startprojectstartapp같은 파이썬 패키지에 "프로젝트"와 "응용 프로그램을"결합에서 당신을 막을 아무것도 없다. 프로젝트는 settings모듈에 지나지 않으며, 앱은 models모듈에 지나지 않습니다 . 다른 모든 것은 선택 사항입니다.

소규모 사이트의 경우 다음과 같은 것이 좋습니다.

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

18
+1 요약 : 프로젝트에는 settings.py가 있고 앱에는 models.py가 있습니다. 그것들은 같은 수준의 구조입니다. 필자는 프로젝트가 앱보다 한 단계 높았다 고 생각
했었다.

2
@ claymation, 'python manage.py makemigrations'또는 'python manage.py migrate'가 'my product'디렉토리의 'models.py'파일을 볼 수 있도록 설정에 무엇을 포함해야합니까 (앱으로)?
mlwn

1
@ mlwn 나는 이것에 대답하는 데 늦었다는 것을 알고 있지만 비슷한 상황에 처해 있으며 많은 답을 찾고 있습니다. 질문에 대답하려면 프로젝트를 INSTALLED_APPS목록 에 포함시키기 만하면됩니다. 예를 들면 다음과 같습니다. stackoverflow.com/a/59739912/399435
Karthic Raghupathi

@KarthicRaghupathi, 감사합니다 .. :) 4 년 후 답변을보고 반갑습니다 .. 건배
mlwn

69

"응용 프로그램은 무엇을합니까?"라는 질문에 대답하십시오. 한 문장으로 대답 할 수 없다면, 논리를 깔끔하게 정리하여 여러 앱으로 나눌 수 있습니다.

나는 django와 함께 일하기 시작한 직후 어딘가 에서이 생각을 읽었으며 나는이 질문을 자주 자주 묻는 것이 나에게 도움이된다는 것을 알게되었습니다.

앱은 재사용 할 필요가 없으며 서로 의존 할 수 있지만 한 가지만해야합니다.


8
내 앱을 레이아웃 할 때 여전히 어려움을 겪고 있습니다. 내 주요 응용 프로그램이 약간 무겁지 만 동시에 느슨하게 결합 된 것과 비슷한 것으로 리팩터링 할 수는 없습니다. 주요 주체가 여전히 서로 크게 의존하고 있으며 재사용하거나 일반화 할 필요가 없다면 주요 주체를 분리하는 것이 실제로 개선되지 않을 것이라고 생각하고 있습니다. 나는 "조기 리팩터링하지 마라"는 "조기 최적화하지 마라"의 해석으로 기울고있다
acjay


8

그렇다면 Django의 project.app 네임 스페이스와 관련하여 myproduct.myproduct를 사용하는 경향이 있지만 물론 이것은 허용되지 않습니다.

허용되지 않는 것은 없습니다. 그 프로젝트는 아무도 당신을 제한하지 않습니다. 합리적인 이름을 유지하는 것이 좋습니다.

어떤 상황에서도 제품의 일부를 재사용 할 수 없습니다. 직관적으로, 나는 이것을 "응용 프로그램"이라고 부릅니다. 그런 다음 하나의 "app"폴더에서 모든 작업을 수행합니까?

일반적인 장고 프로젝트에는 모든 프로젝트에서 실제로 사용되는 많은 앱 (contrib 앱)이 있습니다.

프로젝트가 하나의 작업 만 수행하고 하나의 앱 만 가지고 있다고 가정 해 봅시다 ( main프로젝트가 회전하고 거의 플러그 인 할 수 없기 때문에 프로젝트 이름을 지정합니다 ). 이 프로젝트도 여전히 다른 일부 앱을 사용합니다.

이제 프로젝트에서 하나의 앱 ( INSTALLED_APPS='myproduct') 만 사용한다고 말하면 project프로젝트를로 정의하는 데 사용 하는 project.app점은 몇 가지 사항을 고려해야한다고 생각합니다.

  • 프로젝트의 앱 이외의 코드가 처리하는 다른 많은 것들이 있습니다 (기본 정적 파일, 기본 템플릿, 설정 .... 기본 제공).
  • 일반적인 project.app 접근 방식에서 django는 모델에서 SQL 스키마를 자동으로 정의합니다.
  • 기존의 접근 방식으로 프로젝트를 훨씬 쉽게 구축 할 수 있습니다.
  • 원하는대로 URL,보기 및 기타 파일에 대해 다른 이름을 정의 할 수 있지만 필요는 없습니다.
  • 장래에 장고 프로젝트로 쉽게 할 수있는 응용 프로그램을 추가해야 할 수도 있습니다.

응용 프로그램에서 수행되는 대부분의 작업과 관련하여 장고 프로젝트의 대부분이 그러한 경우라고 생각합니다.


1
+1, main컨벤션을 위한 esp- 이런 오리지널 프로젝트에 대해 나에게 많은 의미가 있습니다. 나중에 "재사용 가능한"앱을 추가 할 계획이지만 지금은 초점이 맞지 않습니다.
Dolph

2

여기서 Django 제작자는 그 차이 자체를 지적합니다 . 그들이해야로서 나는 앱에 대한 그 생각을 생각 재사용 다른 프로젝트에 좋은 . 또한 장고의 앱에 대한 좋은 생각은 최신 웹 애플리케이션을 제공합니다.

JavaScript를 기반으로 큰 동적 웹 응용 프로그램을 만들고 있다고 상상해보십시오. .

그런 다음 django App에서 예를 들어 "FrontEnd"<-를 생성 할 수 있습니다.

그런 다음 일부 백엔드 앱을 만듭니다. 예를 들어 "댓글"이라는 앱은 사용자 의견을 저장합니다. 그리고 "댓글"앱은 아무것도 표시하지 않습니다. 동적 JS 웹 사이트 의 AJAX 요청에 대한 API 일뿐 입니다.

이런 식으로 항상 "댓글"앱을 재사용 할 수 있습니다. 전체 프로젝트의 소스를 열지 않고도 오픈 소스로 만들 수 있습니다. 그리고 당신은 프로젝트의 논리 를 깨끗하게 유지 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.