2016-08-01 14 views
1

Ich habe eine Python-Anwendung, die in einem Framework ausgeführt wird, das ein Netzwerkprotokoll steuert, um Remote-Geräte zu steuern. Jetzt möchte ich eine browserbasierte Überwachung und Kontrolle hinzufügen und schaue mir das Pyramid-Framework an, um es zu erstellen.Aufrufen einer Pyramiden-Framework-Anwendung aus einer anderen Anwendung

Normalerweise starten Sie eine Pyramid-Anwendung mit pserve über eine Befehlszeile, aber ich kann keine Dokumentation oder Beispiele finden, wie Sie sie in einem Host-Anwendungsframework aufrufen können. Dies muss so erfolgen, dass der Pyramid-Code auf Objekte in der Host-Anwendung zugreifen kann.

Ist dies ein praktischer Anwendungsfall für Pyramid oder sollte ich nach einem anderen WSGI-basierten Framework suchen?

Antwort

1

Eine WSGI-App ist im Grunde eine Funktion, die einige Eingaben empfängt und eine Antwort zurückgibt. Sie brauchen nicht wirklich,, um eine WSGI-Anwendung zu bedienen. Sie ist eher ein Wrapper, der eine Anwendung aus einer INI-Datei zusammenfügt.

Werfen Sie einen Blick auf Creating Your First Pyramid Application Kapitel in Pyramid docs:

from wsgiref.simple_server import make_server 
from pyramid.config import Configurator 
from pyramid.response import Response 

def hello_world(request): 
    return Response('Hello %(name)s!' % request.matchdict) 

if __name__ == '__main__': 
    config = Configurator() 
    config.add_route('hello', '/hello/{name}') 
    config.add_view(hello_world, route_name='hello') 
    app = config.make_wsgi_app() 
    server = make_server('0.0.0.0', 8080, app) 
    server.serve_forever() 

die letzten beiden Zeilen erstellen einen Server, der auf Port 8080

Jetzt hört, ist das trickier Problem, dass die serve_forever Anruf blockiert, das Programm stoppt in dieser Zeile, bis Sie drücken Ctrl - C und stoppen Sie das Skript. Dies macht es ein bisschen nicht trivial, dass Ihr Programm "ein Netzwerkprotokoll zur Steuerung von entfernten Geräten ansteuert" und gleichzeitig Webseiten bedient (im Gegensatz zu anderen ereignisbasierten Plattformen wie Node.js, wo es einfach ist) zwei Server haben, die auf verschiedenen Ports innerhalb desselben Prozesses zuhören).

Eine mögliche Lösung für dieses Problem wäre, den Webserver in einem separaten Thread auszuführen.

+0

Ein separater Thread scheint nicht schwer. Ist alles in der Ini-Datei etwas, das über Funktionen im Configurator() gesteuert werden kann? – AlanObject

+1

Nun, einen Thread zu starten, ist in der Tat nicht schwer. Gleichzeitigen Zugriff auf Ihre "Host Application Objects" kann (oder möglicherweise) einige Tricks erfordern. – Sergey

+1

In Bezug auf Configurator() vs .ini - der Konfigurator hat alles zu konfigurieren * eine Pyramid-App *, aber Paste kann eine INI-Datei verwenden, um einen Stapel von WSGI-Anwendungen zu assemblieren, von denen einige möglicherweise keine Pyramid-Anwendungen sind. Sie können beispielsweise eine Pyramid-App, eine Django-App und eine Flask-App gemeinsam ausführen lassen. – Sergey

Verwandte Themen