title: Python Autobahn websocket
body: <p>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.</p>
  
  <p>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.</p>
  
  <p>What I tried is a simple autobahn script server.py and an index.html file.</p>
  
  <p>In the server.py script I implemented this code but it is not working..</p>
  
  <pre><code>#! /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 &lt;toHexString(card.atr)&gt; 
              for card in removedcards:
                  print "-Removed: ", toHexString(card.atr)
          #call javascript function with &lt;toHexString(card.atr)&gt; 
  
      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) &gt; 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()
  </code></pre>
  
  <p>In the index file there is a JavaScript function </p>
  
  <pre><code>function NFCid(msg) {
    alert(msg);
  }
  </code></pre>
  
  <p>How can I call this function inside server.py</p>
  
  <pre><code>NFCid(toHexString(card.atr))
  </code></pre>