2012-12-31 42 views
0

Python能做的所有事情都给我留下了深刻的印象。我想知道的是,如果我可以实现一个可以调用JavaScript函数的Python脚本。Python Autobahn websocket

我使用的Python代码是检测NFC卡并读取唯一ID。目前我使用Java applet与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); 
} 

我如何可以调用这个函数inside server.py

NFCid(toHexString(card.atr)) 
+0

Java小应用程序在浏览器中运行,并且正确签名时可以访问浏览器沙箱以外的内容。在Python中没有相同之处。 –

+0

你没有足够的信息在这里,代码甚至没有看起来有效。一个普遍的观察,就pyscard和扭曲,我怀疑你可以直接使用它们,因为pyscard没有扭曲感知,并可能在一个单独的线程监控。 – jlujan

回答

2

它一般可以设置一个WebSocket连接将数据从运行Web(套接字)服务器的Python进程传送到JavaScript函数。但是,您必须从JavaScript明确设置WebSocket连接,并将其连接到服务器进程。然后,您可以将通过WebSocket连接(例如从Python)传入的任何数据传递给任何JavaScript函数。

相关问题