2013-01-14 39 views
1

我试图在服务器上部署基于瓶的应用程序,但是我遇到了问题。基本的处理程序似乎工作正常,但是我连接到MySQL的一个给我错误500.使用apache部署基于瓶的应用程序时的MySQL连接mod_wsgi

我使用apache和mod_wsgi在Debian linux上将该应用程序部署为用户瓶。我以这个用户身份登录,并尝试在不同的端口上手动运行应用程序,然后它完全正常工作。

我检查烧瓶日志,这是我看到的错误:

[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 

该应用的代码被以下:

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

我添加下面的反馈后的变化:

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() 

但我仍然得到错误:

File "/Users/pisarzp/Desktop/SusyChoosy/susyAPI/susyapi.py", line 84, in db_disconnect 
g.db.close() 
NameError: global name 'g' is not defined 

试着用搜索引擎,但没有发现任何东西。有什么建议?

回答

4

mod_wsgi忽略if __name__ == '__main__'条件后的代码块,您需要在其他地方设置您的数据库连接。一个好的地方是before_requestteardown_request处理程序,因此您的连接设置,并设置为每个请求,否则你将会有麻烦,因为MySQL将下降长期连接:

from flask import g 

@app.before_request 
def db_connect(): 
    g.db_conn = MySQLdb.connect(host=settings.DB_HOST, 
           user=settings.DB_USER, 
           passwd=settings.DB_PASSWD, 
           db=settings.DB_NAME) 

@app.teardown_request 
def db_disconnect(exception=None): 
    g.db_conn.close() 
+0

我只好把空格后@适合意见的指导原则...... “ 高清connect_db(): db_conn = MySQLdb.connect(主机= settings.DB_HOST,用户= settings.DB_USER,passwd文件= settings.DB_PASSWD,DB = settings.DB_NAME) 回报db_conn ' @ app.before_request def db_connect(): g.db = connect_db() @ app.teardown_request 高清db_disconnect(例外=无): g.db.close()” 但我仍然得到错误: 文件 “/Users/pisarzp/Desktop/SusyChoosy/susyAPI/susyapi.py”,行84,在db_disconnect g.db.close()' NameError:全局名称'g'未定义 尝试使用Google搜索,但找不到任何内容。有什么建议? – pisarzp

+0

我在编辑的问题中插入了格式正确的代码,对不起。 – pisarzp

+0

你需要从'flask import g'导入'g':''。查看[application globals]上的文档(http://flask.pocoo.org/docs/api/#application-globals)。 –

相关问题