2010-12-26 2 views
2

장고 웹 응용 프로그램이 있습니다. 나는 또한 장황한 서버를 가지고 같은 머신에서 트위스트를 사용하여 쓰여진 서버를 가지고있다. (localhost:8090에서 실행 중이다.) 사용자가 어떤 행동을 할 때 아이디어가되는 것은 Django에게 오는 것이고,이 Django는 뒤틀린 서버 & 서버에 연결하여 장고로 데이터를 보냅니다. 마지막으로 Django는이 데이터를 일부 html 템플릿 &에 넣어 사용자에게 다시 제공합니다.Python, Twisted, Django, reactor.run() 문제가 발생했습니다

여기 내가 문제가있는 곳입니다. 내 Django 응용 프로그램에서 요청이 들어 오면 로컬로 트위스트 된 서버에 연결하는 간단한 트위스트 클라이언트를 만듭니다.

... 
     factory = Spell_Factory(query) 
     reactor.connectTCP(AS_SERVER_HOST, AS_SERVER_PORT, factory) 
     reactor.run(installSignalHandlers=0) 
     print factory.results 
... 

reactor.run()이 문제의 원인입니다. 이벤트 루프이기 때문에. Django가이 동일한 코드를 실행하면 서버에 연결할 수 없습니다. 어떻게 처리하나요?

답변

4

위의 두 답변이 맞습니다. 그러나 이미 맞춤법 을 구현 한 경우 을 실행하면으로 실행됩니다. localhost:PORT에서 별도의 프로세스와 동일한 시스템에서 실행하여 시작할 수 있습니다. 지금 당장은 이미 아주 간단한 바이너리 프로토콜 인터페이스를 가지고있는 것으로 보인다. 블로킹 모드에서 표준 lib의 socket 인터페이스를 사용하여 똑같이 간단한 파이썬 클라이언트를 구현할 수있다.

그러나 twisted.web으로 놀고 간단한 웹 인터페이스를 드러내는 것이 좋습니다. JSON을 사용하여 데이터를 직렬화 및 비 직렬화 할 수 있습니다. 이는 장고가 잘 지원합니다.

import json 
from twisted.web import server, resource 
from twisted.python import log 

class Root(resource.Resource): 
    def getChild(self, path, request): 
     # represents/on your web interface 
     return self 

class WebInterface(resource.Resource): 
    isLeaf = True 
    def render_GET(self, request): 
     log.msg('GOT a GET request.') 
     # read request.args if you need to process query args 
     # ... call some internal service and get output ... 
     return json.dumps(output) 

class SpellingSite(server.Site): 
    def __init__(self, *args, **kwargs): 
     self.root = Root() 
     server.Site.__init__(self, self.root, **kwargs) 
     self.root.putChild('spell', WebInterface()) 

그리고 당신은 다음과 같은 골격 .tac 파일을 사용할 수 있습니다 그것을 실행 : 다른 기계 하나에서 실행 할 수 있습니다 또 다른 최고 수준의 서비스로 서비스를 실행

from twisted.application import service, internet 

site = SpellingSite() 
application = service.Application('WebSpell') 
# attach the service to its parent application 
service_collection = service.IServiceCollection(application) 
internet.TCPServer(PORT, site).setServiceParent(service_collection) 

을 여기에 매우 빠른 예제 웹 인터페이스를 노출하면 역방향 프록시로드 밸런서를 수평으로 쉽게 확장 할 수 있습니다.

+0

이미 알아 냈습니다. 하지만 고마워. –

1

트위스티드 서버에서 결과를 얻거나 오류/시간 초과가 발생하면 원자로를 정지해야합니다. 따라서 각 Django 요청에 대해 Twisted 서버를 쿼리해야하는 경우 reactor를 실행 한 다음 중지해야합니다. 그러나 Twisted 라이브러리는 지원하지 않습니다. 반응기는 재시작 할 수 없습니다. 가능한 해결책 : 트위스트 반응에 대한

  • 를 사용하여 별도의 스레드,하지만 당신은 지금이 중 하나를하지 않습니다,하지만 당신은 쓸 수 있습니다 (장기 실행 스레드에 대한 지원을하고 서버와 장고 응용 프로그램을 배포해야합니다 당신 자신을 쉽게 :-)).

  • 클라이언트 프로토콜을 구현하는 데 Twisted를 사용하지 말고 일반 stdlib의 socket 모듈 만 사용하십시오.

3

reactor.run()은 전체 프로그램에서 한 번만 호출해야합니다. "이 한 가지 요청을 시작하십시오"라고 생각하지 말고 "Twisted all of start"로 생각하십시오.

반응기를 백그라운드 스레드에서 실행하는 것이이 문제를 해결하는 한 가지 방법입니다. 당신의 django 애플리케이션은 Django 애플리케이션에서 blockingCallFromThread을 사용할 수 있으며 Twisted API는 차단 API처럼 사용할 수 있습니다. 하지만이 배경 트위스트 스레드는 적절한 시간 (인터프리터가 초기화되고 해체 될 때)마다 시작되고 중지되어야합니다. 따라서 WSGI 컨테이너에서 약간의 협조가 필요합니다.

WSGI 컨테이너로 Twisted를 사용할 수도 있습니다. 그러면 특별한 것을 시작하거나 중지 할 필요가 없습니다. blockingCallFromThread은 즉시 작동합니다. twistd web --wsgi에 대한 명령 줄 도움말을 참조하십시오.

관련 문제