Reputation: 545
I am impressed by all the things Python can do. What I like to know is if I can implement a Python script that can call a JavaScript function.
The Python code I use is detecting an NFC card and reads the Unique ID. Currently I use a Java applet to interact with an HTML page. I think Python is much lighter and better for this.
What I tried is a simple autobahn script server.py and an index.html file.
In the server.py script I implemented this code but it is not working..
#! /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()
In the index file there is a JavaScript function
function NFCid(msg) {
alert(msg);
}
How can I call this function inside server.py
NFCid(toHexString(card.atr))
Upvotes: 0
Views: 1771
Reputation: 11711
It would in general be possible to set up a WebSocket connection that ferries data from a Python process running a web(sockets) server to a JavaScript function. However, you'd have to explicitly setup a WebSocket connection from JavaScript and have it connect to the server process. Then, you can pass any data coming in over the WebSocket connection (e.g. from Python) to any JavaScript function.
Upvotes: 2