2
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/hello/<name>')
def hello(name):
    return render_template('page.html', name=name)

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

I can currently use html a href to navigate to the next page, when the user pressed the href link on the screen.

index.html:

<html>
<head>
<link rel="stylesheet" href='/static/style3.css' />
</head>
<body>
<h1>Hello from a template!</h1>
<p><a href='/hello/test'>Go to hello link</a> is a link to a page on this website.</p>
</body>
</html>

However, I have a barcode scanner (using evdev) which will trigger an event when a barcode is scanned. How, can I use this event to navigate to the next page?

import evdev
from evdev import InputDevice, categorize, ecodes  
dev = InputDevice('/dev/input/event1')

# Provided as an example taken from my own keyboard attached to a Centos 6 box:
scancodes = {
    # Scancode: ASCIICode
    0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8',
    10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'q', 17: u'w', 18: u'e', 19: u'r',
    20: u't', 21: u'y', 22: u'u', 23: u'i', 24: u'o', 25: u'p', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL',
    30: u'a', 31: u's', 32: u'd', 33: u'f', 34: u'g', 35: u'h', 36: u'j', 37: u'k', 38: u'l', 39: u';',
    40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\\', 44: u'z', 45: u'x', 46: u'c', 47: u'v', 48: u'b', 49: u'n',
    50: u'm', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
}

capscodes = {
    0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 9: u'*',
    10: u'(', 11: u')', 12: u'_', 13: u'+', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',
    20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'{', 27: u'}', 28: u'CRLF', 29: u'LCTRL',
    30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u':',
    40: u'\'', 41: u'~', 42: u'LSHFT', 43: u'|', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 49: u'N',
    50: u'M', 51: u'<', 52: u'>', 53: u'?', 54: u'RSHFT', 56: u'LALT',  57: u' ', 100: u'RALT'
}
#setup vars
x = ''
caps = False

#grab provides exclusive access to the device
dev.grab()

#loop
for event in dev.read_loop():
    if event.type == ecodes.EV_KEY:
        data = categorize(event)  # Save the event temporarily to introspect it
        if data.scancode == 42:
            if data.keystate == 1:
                caps = True
            if data.keystate == 0:
                caps = False
        if data.keystate == 1:  # Down events only
            if caps:
                key_lookup = u'{}'.format(capscodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
            else:
                key_lookup = u'{}'.format(scancodes.get(data.scancode)) or u'UNKNOWN:[{}]'.format(data.scancode)  # Lookup or return UNKNOWN:XX
            if (data.scancode != 42) and (data.scancode != 28):
                x += key_lookup  
            if(data.scancode == 28):
                print x          # Print it all out!
                x = ''
                # need to trigger an event to switch pages
user1872384
  • 6,886
  • 11
  • 61
  • 103
  • You have to notify client ( browser ) about bar code is scanned and ready to navigate. You have maintain some state traditional WSGI can't able to help. Explore websockets and connect with server from client. – Raja Simon Aug 23 '18 at 06:22
  • Is this method feasible? or should I just use the old Tkinter with horrendous GUI to save the trouble. – user1872384 Aug 23 '18 at 06:54
  • Yes all chatting application works like this. Also you can use messaging framework like firebase cloud messaging to send message. – Raja Simon Aug 23 '18 at 07:23
  • I see. I'm hosting it on a local server and the scanner is connected locally as well. Perhaps open a socket to listen for events from python script (which will listen to the event from scanner)? – user1872384 Aug 23 '18 at 07:28
  • Hmm yes you can open socket and push message to client, In this case I suggest you to try SSE ( Note this is just for testing ) Please see my repo for how to do server sent event [webtop](https://github.com/rajasimon/webtop) – Raja Simon Aug 23 '18 at 07:37
  • Server send something to client constantly and client receiving it. In your case after the use clicks something navigate to some route. And then wait for SSE. After finishing the scanner send message to client. – Raja Simon Aug 23 '18 at 07:39
  • You can use flask-sse package as well for better code. – Raja Simon Aug 23 '18 at 07:40
  • https://github.com/singingwolfboy/flask-sse – Raja Simon Aug 23 '18 at 07:40

0 Answers0