Веб-сокет Python Autobahn

Меня впечатляют все возможности Python. Мне хотелось бы знать, могу ли я реализовать скрипт Python, который может вызывать функцию JavaScript.

Код Python, который я использую, обнаруживает карту NFC и считывает уникальный идентификатор. В настоящее время я использую апплет Java для взаимодействия с HTML-страницей. Я думаю, что Python намного легче и лучше для этого.

Что я пробовал, так это простой скрипт автобана server.py и файл index.html.

В сценарии server.py я реализовал этот код, но он не работает.

#! /usr/bin/env python

from sys import stdin, exc_info
from time import sleep

from smartcard.CardMonitoring import CardMonitor, CardObserver
from smartcard.util import *
import sys

from twisted.internet import reactor
from twisted.python import log
from twisted.web.server import Site
from twisted.web.static import File

from autobahn.websocket import WebSocketServerFactory, \
                               WebSocketServerProtocol, \
                               listenWS


class EchoServerProtocol(WebSocketServerProtocol):

   # a simple card observer that prints inserted/removed cards
    class printobserver(CardObserver):
        """A simple card observer that is notified
        when cards are inserted/removed from the system and
        prints the list of cards
        """

        def update(self, observable, (addedcards, removedcards)):
            for card in addedcards:
                print "+Inserted: ", toHexString(card.atr)
        #call javascript function with <toHexString(card.atr)> 
            for card in removedcards:
                print "-Removed: ", toHexString(card.atr)
        #call javascript function with <toHexString(card.atr)> 

    try:
        print "Insert or remove a smartcard in the system."
        print "This program will exit in 10 seconds"
        print ""
        cardmonitor = CardMonitor()
        cardobserver = printobserver()
        cardmonitor.addObserver(cardobserver)

        sleep(10)

        # don't forget to remove observer, or the
        # monitor will poll forever...
        cardmonitor.deleteObserver(cardobserver)

        import sys
        if 'win32' == sys.platform:
            print 'press Enter to continue'
            sys.stdin.read(1)

    except:
        print exc_info()[0], ':', exc_info()[1]


if __name__ == '__main__':

   if len(sys.argv) > 1 and sys.argv[1] == 'debug':
      log.startLogging(sys.stdout)
      debug = True
   else:
      debug = False

   factory = WebSocketServerFactory("ws://localhost:9000",
                                    debug = debug,
                                    debugCodePaths = debug)

   factory.protocol = EchoServerProtocol
   factory.setProtocolOptions(allowHixie76 = True)
   listenWS(factory)

   webdir = File(".")
   web = Site(webdir)
   reactor.listenTCP(8080, web)

   reactor.run()

В индексном файле есть функция JavaScript

function NFCid(msg) {
  alert(msg);
}

Как я могу вызвать эту функцию внутри server.py

NFCid(toHexString(card.atr))

person Wouter van Reeven    schedule 31.12.2012    source источник
comment
Java-апплеты запускаются в браузере и при правильном подписании могут иметь доступ за пределами песочницы браузера. В Python нет эквивалента этому.   -  person Burhan Khalid    schedule 31.12.2012
comment
У вас недостаточно информации, и код даже не выглядит действительным. Общее наблюдение, что касается pyscard и скрученных, я сомневаюсь, что вы можете использовать их напрямую, поскольку pyscard не поддерживает скрученные и, вероятно, отслеживает в отдельном потоке.   -  person jlujan    schedule 01.01.2013


Ответы (1)


В общем случае было бы возможно настроить соединение WebSocket, которое переправляет данные из процесса Python, на котором запущен веб-сервер (сокеты), в функцию JavaScript. Однако вам придется явно настроить соединение WebSocket из JavaScript и подключить его к серверному процессу. Затем вы можете передавать любые данные, поступающие через соединение WebSocket (например, из Python), в любую функцию JavaScript.

person djc    schedule 03.01.2013