Pregunta

Tengo una aplicación web Django. También tengo un servidor hechizo escrito usando correr trenzado en la misma máquina que tiene Django (que se ejecuta en localhost:8090). La idea que es cuando el usuario hace alguna acción, petición llega a Django que a su vez se conecta a este servidor trenzado y el servidor devuelve los datos a Django. Finalmente Django pone estos datos en algunas plantillas html y sirve de vuelta al usuario.

Aquí es donde yo estoy teniendo un problema. En mi aplicación Django, cuando la petición llega creo un cliente sencillo trenzado para conectar al servidor trenzado ejecutar localmente.

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

El reactor.run() está causando un problema. Dado que se trata de un ciclo de eventos. La próxima vez que este mismo código es ejecutado por Django, soy incapaz de conectar con el servidor. ¿Cómo se puede manejar esto?

¿Fue útil?

Solución

Las dos respuestas anteriores son correctas. Sin embargo, teniendo en cuenta que ya ha implementado una ortografía servidor y luego Ejecutar como uno . Puede comenzar ejecutando en la misma máquina como un proceso separado - en localhost:PORT. En este momento parece que tiene una interfaz muy simple protocolo binario ya -. Puede implementar una igualmente sencilla interfaz de cliente Python usando socket del lib estándar en modo de bloqueo

Sin embargo, sugiero jugar con twisted.web y exponer una simple interfaz web. Puede utilizar JSON para serializar y deserializar los datos - que está bien apoyado por Django. He aquí un ejemplo muy rápida:

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())

Y para ejecutarlo se puede utilizar el siguiente archivo de .tac esqueleto:

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)

El funcionamiento de su servicio como un servicio de primera clase le permite ejecutar en otra máquina un día si usted encuentra la necesidad -. Exponer una interfaz web facilita la horizontal escalar detrás de un equilibrador de carga de proxy inverso también

Otros consejos

reactor.run() debe ser llamado una sola vez en toda su programa. No pensar en él como "empezar éste petición que hago", pensar en él como "empezar todo de Twisted".

Ejecución del reactor en un subproceso de fondo es una manera de evitar esto; a continuación, su aplicación Django puede utilizar blockingCallFromThread en su aplicación Django y el uso de una API de Twisted como se puede bloquear cualquier API. Se necesita un poco de cooperación de su contenedor WSGI, sin embargo, ya que necesitará para asegurarse de que este fondo trenzado hilo se inicia y se detiene en el momento adecuado (cuando se inicia el intérprete y derribada, respectivamente).

También podría usar torcida como su contenedor WSGI, y entonces no es necesario para iniciar o parar nada especial; blockingCallFromThread se acaba de trabajar inmediatamente. Consulte la ayuda en línea de comandos para twistd web --wsgi.

Se debe dejar reactor después de que tienes los resultados desde un servidor trenzado o algún suceso de error / tiempo de espera. Así que en cada solicitud de Django que requiere consulta su servidor Twisted debe ejecutar reactor y luego se detiene. Sin embargo, no es apoyada por la biblioteca Twisted - reactor no se puede reiniciar. Posibles soluciones:

  • Usar hilo separado para el reactor trenzado, pero se necesita para desplegar su aplicación Django con el servidor, que tiene soporte para hilos de larga duración (no lo hago ahora ninguno de estos, pero usted puede escribir su propio fácilmente: -.))

  • No utilice torcida para la implementación de protocolos de cliente, sólo tiene que utilizar el módulo de socket stdlib llanura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top