2014-04-27 7 views
1

내가 (아직 모델) 장고에서 실행하지 않는 매우 간단한 프로젝트있어 그 포트에 각각 개별적으로 각각의 응용 프로그램을 제공하고 난 다음을 수행해야합니다장고는

내가이 애플 리케이션, 'Ebony''Ivory'을 만든

그 서로 다른 컴퓨터에서 실행되도록 설계되었지만 지금은 충분합니다.) 메시지를 통해 서로 통신해야합니다.

문제는 Django Debug 서버가 특정 포트에서 실행되는 프로세스라는 것입니다. 내가하고 싶은 일은 각각 'App'이 같은 서버에있는 자신의 포트를 청취하고 가능하다면 동일한 장고 프로젝트 하에서 듣는 것입니다. 그러한 시나리오가 가능합니까? 그리고 그렇다면 어떻게해야합니까?

미리 감사드립니다.

답변

4

이것은 가능하지만 개념화하는 방식이 아닙니다. Django 앱은 주어진 웹 서버에서 실행되는 것의 일부입니다. 따라서 Django 프로젝트는 하나 이상의 앱을 가지고 있으며 하나의 웹 서버의 일부로 실행됩니다.

해결책은 Django의 여러 인스턴스를 실행하는 것입니다. 디버그 서버로 얼마나 잘 작동하는지 확신 할 수 없습니다. 당신은 할 수 있습니다 예를 들어, 경우 포트를 여는 방법을 말하는 그것을 매개 변수를 제공하여 run each server on its own port :

./manage.py runserver 8000 

가 127.0.0.1:8000에 디버그 서버를 실행하고

./manage.py runserver 8080 

다른 디버그 서버를 실행 127.0.0.1:8080. 보통이 작업은 별도의 쉘로 수행됩니다.

이 중 하나의 INSTALLED_APPS 설정이 'Ebony'이고 다른 하나가 'Ivory'이어야합니다. 또한 각 인스턴스에 다른 인스턴스에 연결하는 방법을 알려주는 방법을 찾아야합니다 (일반적으로 루트 URL을 지정 함).


그렇다면 나중에 두 개의 앱이 동일한 데이터베이스를 공유하는지 확인해야합니다. 그렇다면 두 시스템이 모두 연결될 수 있는지 확인하십시오. 그렇지 않은 경우 settings.pyDATABASES 값이 서로 다른지 확인하십시오. 데이터베이스를 공유하는 경우 Django의 sites framework을 사용하면 모델에서 일을 바로 처리 할 수 ​​있습니다.


두 프로젝트를 모두 실행하려면 장고에게 어느 것을 실행할지를 알려줘야합니다. 나는 환경 변수를 선호한다. 당신의 settings.py 파일에서

SHARD=Ebony ./manage.py runserver 8000 

SHARD=Ivory ./manage.py runserver 8080 

는,이 변수가 os.environ를 통해 액세스 할 수 있습니다 : 이것은 위의 runserver 명령을 변경합니다. INSTALLED_APPS 설정은 각 샤드에 대해 서로 다른 값을 가질 수 있도록 그래서, 예를 들어, 당신은 같은 것을 쓰기 :이 파일에 설정으로 SHARD을 정의하여

SHARD = os.environ["SHARD"] 

# Apps common to all shards go here. 
LOCAL_APPS = [ 
    commonApp, 
] 

# Add apps specific to each shard. 
if SHARD == "Ebony": 
    LOCAL_APPS += [ 
     Ebony, 
    ] 
elif SHARD == "Ivory": 
    LOCAL_APPS += [ 
     Ivory, 
    ] 

# Add them to the apps that aren't mine. 
INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.admin', 
    # ... omitted for brevity ... 
    'django_extensions', 
    'south', 
    'debug_toolbar', 
) + LOCAL_APPS 

을, 당신은 환경의 모든 코드에 액세스 할 필요가 없도록 변수를 사용하고 나중에 변경할 경우를 대비하여 을 설정하는 로직을 settings.py으로 제한하십시오. 필요한 경우 다른 파이썬 파일은 from django.conf.settings import SHARD으로 설정을 가져올 수 있습니다.

각 샤드에게 고유 한 DATABASES 설정을 제공하는 비슷한 메커니즘이 사용될 수 있습니다. 그리고 settings.py의 다른 것.

from django.conf.urls import * 
from django.conf import settings 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    url(r'^$', 'commonApp.views.get_homepage', name='home'), 
    url(r'^login$', 'django.contrib.auth.views.login', name="login"), 
    url(r'^logout$', 'django.contrib.auth.views.logout', 
     {"next_page": "/"}, name="logout"), 
# Admin 
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 
    url(r'^admin/', include(admin.site.urls)), 
) 

# Auto-add the applications. 
for app in settings.LOCAL_APPS: 
    urlpatterns += patterns('', 
     url(r'^{0}/'.format(app), include(app + '.urls', namespace=app)), 
    ) 

이 앱을 자신의 urls.py 파일이 필요 의미하고, 앱 URL 이름은 앱 이름을 접두어로 얻을 :

그런 다음 나중에 urls.py 파일에, 당신은 당신의 애플 리케이션 '의 URL에 끌어 것을 사용 . 그러므로 앱 Ebonyname="index"으로 URL 패턴을 정의하면 해당 URL을 {% url 'Ebony:index' %} 템플릿으로 가져옵니다.

+0

좋습니다. 'INSTALLED_APPS' 설정 부분에서 좀 더 구체적으로 설명해 주시겠습니까? 첫 번째 앱에는'흑단 '이 있어야하고 다른 앱에는'아이보리 '가 있어야한다고 말했습니까? 그러나 나는'Ebony' 폴더 아래에 하나의 settings.py 파일 만 가지고 있습니다 ... – kstratis

+1

그 대답은 당신이 어떻게하고 싶은지에 대한 세부 사항을 요구합니다. 두 개의 별도 Django 프로젝트 (각 앱마다 하나씩)를 만들 수도 있고 두 개의 서버에 하나의 프로젝트 만 가질 수도 있습니다. –

+0

두 번째 옵션을 선택하겠습니다. 두 개의 서버에 두 개의 응용 프로그램이있는 단일 프로젝트 (현재는 디버그 서버가 바람직 함). 나는'INSTALLED_APPS'을 설정하는 방법을 알았지 만'urls.py'로 고민하고 있습니다. 문제는 특정 서버 인스턴스를 기반으로 URL 매핑을 구분하는 방법을 장고에게 알릴 방법이 없다는 것입니다. 예를 들어 나는'urls.py'에'url (r '^ Ebony/$', task1)'과'url (r '^ Ivory/$', task2)'두 개의 URL을 가지고 있다고 가정합니다. 내가'http : 127.0.0.1 : 80/Ebony'를 할 때 나는 task1 (아이보리도 마찬가지 임)을 얻을 필요가있다. 그러나'http : 127.0.0.1 : 8080/Ebony'를한다면 나는 일을 얻지 않아야한다. – kstratis