cloud-run-cloud-sql/main.py (94 lines of code) (raw):

import datetime import logging import os import random import time from flask import Flask, render_template, request, Response import sqlalchemy # Hydrate the environment from the .env file from dotenv import load_dotenv load_dotenv() app = Flask(__name__) logger = logging.getLogger() def init_db_connection(): db_config = { 'pool_size': 5, 'max_overflow': 2, 'pool_timeout': 30, 'pool_recycle': 1800, } return init_unix_connection_engine(db_config) def init_unix_connection_engine(db_config): pool = sqlalchemy.create_engine( sqlalchemy.engine.url.URL( drivername="postgres+pg8000", host=os.environ.get('DB_HOST'), port=os.environ.get('DB_PORT'), username=os.environ.get('DB_USER'), password=os.environ.get('DB_PASS'), database=os.environ.get('DB_NAME'), ), **db_config ) pool.dialect.description_encoding = None return pool db = init_db_connection() @app.route('/', methods=['GET']) def index(): votes = [] with db.connect() as conn: # Execute the query and fetch all results recent_votes = conn.execute( "SELECT candidate, time_cast FROM votes " "ORDER BY time_cast DESC LIMIT 5" ).fetchall() # Convert the results into a list of dicts representing votes for row in recent_votes: votes.append({ 'candidate': row[0], 'time_cast': row[1] }) stmt = sqlalchemy.text( "SELECT num_votes FROM totals WHERE candidate=:candidate") # Count number of votes for tabs tab_result = conn.execute(stmt, candidate="TABS").fetchone() tab_count = tab_result[0] if tab_result is not None else 0 # Count number of votes for spaces space_result = conn.execute(stmt, candidate="SPACES").fetchone() space_count = space_result[0] if space_result is not None else 0 return render_template( 'index.html', recent_votes=votes, tab_count=tab_count, space_count=space_count ) @app.route('/', methods=['POST']) def save_vote(): # Get the team and time the vote was cast. team = request.form['team'] time_cast = datetime.datetime.utcnow() # Verify that the team is one of the allowed options if team != "TABS" and team != "SPACES": logger.warning(team) return Response( response="Invalid team specified.", status=400 ) stmt = sqlalchemy.text( "INSERT INTO votes (time_cast, candidate)" " VALUES (:time_cast, :candidate)" ) totals_stmt = sqlalchemy.text( "UPDATE totals SET num_votes = num_votes + 1 WHERE candidate=:candidate" ) try: with db.connect() as conn: conn.execute(stmt, time_cast=time_cast, candidate=team) conn.execute(totals_stmt, candidate=team) except Exception as e: logger.exception(e) return Response( status=500, response="Unable to successfully cast vote! Please check the " "application logs for more details." ) return Response( status=200, response="Vote successfully cast for '{}' at time {}!".format( team, time_cast) ) if __name__ == '__main__': app.run(host='127.0.0.1', port=8080, debug=True)