0

Pythonができるすべてのことに感銘を受けました。私が知りたいのは、JavaScript関数を呼び出すことができるPythonスクリプトを実装できるかどうかです。

私が使用しているPythonコードは、NFCカードを検出し、一意のIDを読み取ります。現在、私は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))
4

1 に答える 1

2

一般に、Web(sockets)サーバーを実行しているPythonプロセスからJavaScript関数にデータを転送するWebSocket接続をセットアップすることは可能です。ただし、JavaScriptからWebSocket接続を明示的に設定し、サーバープロセスに接続する必要があります。次に、WebSocket接続(Pythonなど)を介して入ってくるデータをJavaScript関数に渡すことができます。

于 2013-01-03T12:51:52.257 に答える