I’m trying to deploy my flask based app on a server, however I have a problem. Basic handlers seems to work fine, however one where I connect to MySQL gives me error 500.
I deploy this app as user flask on Debian linux using apache and mod_wsgi. I logged in as this user and tried to manually run the app on different port, and then it worked perfectly fine.
I checked the flask logs, and this is the error I see:
[Sun Jan 13 14:33:27 2013] [error] [20130113-14:33PM] [susyapi] [ERROR] Exception on /1/product [GET]
[Sun Jan 13 14:33:27 2013] [error] Traceback (most recent call last):
[Sun Jan 13 14:33:27 2013] [error] File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1687, in wsgi_app
[Sun Jan 13 14:33:27 2013] [error] response = self.full_dispatch_request()
[Sun Jan 13 14:33:27 2013] [error] File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1360, in full_dispatch_request
[Sun Jan 13 14:33:27 2013] [error] rv = self.handle_user_exception(e)
[Sun Jan 13 14:33:27 2013] [error] File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1358, in full_dispatch_request
[Sun Jan 13 14:33:27 2013] [error] rv = self.dispatch_request()
[Sun Jan 13 14:33:27 2013] [error] File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 1344, in dispatch_request
[Sun Jan 13 14:33:27 2013] [error] return self.view_functions[rule.endpoint](**req.view_args)
[Sun Jan 13 14:33:27 2013] [error] File "/home/pisarzp/susyapi/susyapi.py", line 36, in product_search
[Sun Jan 13 14:33:27 2013] [error] cur = db.cursor()
[Sun Jan 13 14:33:27 2013] [error] NameError: global name 'db' is not defined
The code of the app is following:
from flask import Flask, url_for, session, redirect, escape, request
from subprocess import Popen, PIPE
import socket
import MySQLdb
import urllib
import json
from datetime import datetime
import decimal
import settings
import logging
@app.route('/')
def api_root():
return '200 OK test'
@app.route('/version')
def version():
return '200 OK <BR>Version 0.1'
@app.route('/1/product')
def product_search():
#get the request parameters
product_code = request.args.get('code')
product_code = urllib.unquote(product_code)
#Fetching all product code from database
cur = db.cursor() #This is where I get error
query = "SELECT code from %s GROUP BY 1;" % (settings.DB_PRODUCTS_TABLE)
cur.execute(query)
rows = cur.fetchall()
#Not important part which I cut out
#...
# End of cut
#returning JSON with best matching products info
products_json = []
for code in best_matching_codes:
cur = db.cursor()
query = "SELECT * FROM %s WHERE code LIKE '%s'" % (settings.DB_PRODUCTS_TABLE, code)
cur.execute(query)
columns = [desc[0] for desc in cur.description]
rows = cur.fetchall()
for row in rows:
products_json.append(dict((k,v) for k,v in zip(columns,row)))
return json.dumps(products_json, default = date_handler)
logging.basicConfig(
level=logging.DEBUG,
format='[%(asctime)s] [%(name)s] [%(levelname)s] %(message)s',
datefmt='%Y%m%d-%H:%M%p',
)
if __name__ == '__main__':
app.debug = False
db=MySQLdb.connect(host=settings.DB_HOST, user=settings.DB_USER, passwd=settings.DB_PASSWD, db=settings.DB_NAME)
app.run()
—– EDITED —-
I added following changes after the feedback:
def connect_db():
db_conn = MySQLdb.connect(host=settings.DB_HOST,user=settings.DB_USER,passwd=settings.DB_PASSWD,db=settings.DB_NAME)
return db_conn
@app.before_request
def db_connect():
g.db = connect_db()
@app.teardown_request
def db_disconnect(exception=None):
g.db.close()
But I still get error:
File "/Users/pisarzp/Desktop/SusyChoosy/susyAPI/susyapi.py", line 84, in db_disconnect
g.db.close()
NameError: global name 'g' is not defined
Tried Googling, but couldn’t find anything. Any advice?
The code block after
if __name__ == '__main__'condition is ignored by mod_wsgi, you need to set up your DB connection elsewhere. A good place isbefore_requestandteardown_requesthandlers, so your connection is set up and disposed for each request, otherwise you’re going to have troubles, because MySQL will drop long standing connections: