Python Autobahn websocket



我对Python所能做的一切印象深刻。我想知道的是我是否可以实现一个可以调用JavaScript函数的Python脚本。

我使用的Python代码是检测NFC卡并读取唯一ID。目前我使用Java applet与HTML页面进行交互。我认为Python在这方面更轻、更好。

我尝试的是一个简单的autobahn脚本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))

通常可以设置一个WebSocket连接,将运行web(sockets)服务器的Python进程的数据传递给JavaScript函数。但是,您必须从JavaScript显式地设置WebSocket连接,并使其连接到服务器进程。然后,你可以通过WebSocket连接(例如来自Python)将任何数据传递给任何JavaScript函数。

最新更新