from hashlib import sha256 from time import time sid = sha256(repr(time()).encode()).hexdigest()
shelve
module:
from shelve import open session_store = open('sess_' + sid, writeback=True) # Examples of writing to the file session_store['firstname'] = 'Hugh' session_store['surname'] = 'Jeegoh' # Example of reading from the file print(session_store.get('firstname')) session_store.close()
Suppose our company Shrine of Bacchus Wines sell wines, listed in this database:
CREATE TABLE wines ( wine_id INT AUTO_INCREMENT, name VARCHAR(255) NOT NULL, price DECIMAL(5, 2) NOT NULL, PRIMARY KEY (wine_id) );
show.catalog.py
:#!/usr/local/bin/python3 from cgitb import enable enable() import pymysql as db print('Content-Type: text/html') print() result = '' try: connection = db.connect('localhost', 'userid', 'password', 'database_name') cursor = connection.cursor(db.cursors.DictCursor) cursor.execute("""SELECT * FROM wines ORDER BY wine_id""") result = """<table> <tr><th colspan="3">Our Wines</th></tr> <tr><th>Name</th><th>Price</th><th></th></tr>""" for row in cursor.fetchall(): result += """<tr> <td>%s</td> <td>%s</td> <td><a href="add_to_cart.py?wine_id=%s">Add to cart</a></td> </tr>""" % (row['name'], row['price'], row['wine_id']) result += '</table>' cursor.close() connection.close() except db.Error: result = '<p>Sorry! We are experiencing problems at the moment. Please call back later.</p>' print("""<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Shrine of Bacchus Wines</title> </head> <body> %s <p> <a href="show_cart.py">Show cart</a> </p> </body> </html>""" % (result))
add_to_cart.py
:#!/usr/local/bin/python3 from cgitb import enable enable() from cgi import FieldStorage from os import environ from hashlib import sha256 from time import time from shelve import open from http.cookies import SimpleCookie result = '' try: cookie = SimpleCookie() http_cookie_header = environ.get('HTTP_COOKIE') if not http_cookie_header: sid = sha256(repr(time()).encode()).hexdigest() cookie['sid'] = sid else: cookie.load(http_cookie_header) if 'sid' not in cookie: sid = sha256(repr(time()).encode()).hexdigest() cookie['sid'] = sid else: sid = cookie['sid'].value session_store = open('sess_' + sid, writeback=True) # Get the id of the item being added to the cart form_data = FieldStorage() wine_id = form_data.getfirst('wine_id') # If this item is not in the cart already, then quantity is 1; otherwise, increment the quantity. qty = session_store.get(wine_id) if not qty: qty = 1 else: qty +=1 session_store[wine_id] = qty session_store.close() print(cookie) result = '<p>Item successfully added to your cart.</p>' except IOError: result = '<p>Sorry! We are experiencing problems at the moment. Please call back later.</p>' print('Content-Type: text/html') print() print(""" <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Shrine of Bacchus Wines</title> </head> <body> %s <p> <a href="show_cart.py">Show cart</a> </p> <p> <a href="show_catalog.py">Show catalog</a> </p> </body> </html>""" % (result))
show_cart.py
:#!/usr/local/bin/python3 from cgitb import enable enable() from os import environ from hashlib import sha256 from time import time from shelve import open from http.cookies import SimpleCookie import pymysql as db result = '' try: cookie = SimpleCookie() http_cookie_header = environ.get('HTTP_COOKIE') if not http_cookie_header: sid = sha256(repr(time()).encode()).hexdigest() cookie['sid'] = sid else: cookie.load(http_cookie_header) if 'sid' not in cookie: sid = sha256(repr(time()).encode()).hexdigest() cookie['sid'] = sid else: sid = cookie['sid'].value session_store = open('sess_' + sid, writeback=True) if len(session_store) == 0: result = '<p>No items in shopping cart.</p>' else: connection = db.connect('localhost', 'userid', 'password', 'database_name') cursor = connection.cursor(db.cursors.DictCursor) result = """<table> <tr><th colspan="2">Your Cart</th></tr> <tr><th>Wine</th><th>Quantity</th></tr>""" for wine_id in session_store: cursor.execute("""SELECT name FROM wines WHERE wine_id = %s""", (wine_id)) row = cursor.fetchone() result += '<tr><td>%s</td><td>%s</td></tr>' % (row['name'], session_store.get(wine_id)) result += '</table>' cursor.close() connection.close() session_store.close() print(cookie) except (db.Error, IOError): result = '<p>Sorry! We are experiencing problems at the moment. Please call back later.</p>' print('Content-Type: text/html') print() print(""" <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>Shrine of Bacchus Wines</title> </head> <body> %s <p> <a href="show_catalog.py">Show catalog</a> </p> </body> </html>""" % (result))