使用Apache的mod_wsgi部署基于烧瓶应用程序时,MySQL连接 [英] MySQL connection when deploying flask based app using apache mod_wsgi

查看:188
本文介绍了使用Apache的mod_wsgi部署基于烧瓶应用程序时,MySQL连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想部署一个服务器上的基于我的应用程序烧瓶但是我有一个问题。基本处理程序似乎做工精细,无论人们在那里我连接到MySQL给了我错误500。

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.

我是在Debian Linux用户使用烧瓶Apache和mod_wsgi的部署这个程序。我登录为这个用户和尝试手动运行不同的端口上的应用程序,然后它的工作完美的罚款。

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

应用程序的code为以下内容:

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

----- 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?

推荐答案

的code座如果__name__ =='__main __ 条件是由mod_wsgi的忽略,你需要设置你的数据库连接在别处。一个很好的地方是 before_request teardown_request 处理程序,让你建立连接,并设置在每个请求,否则你'重新将有麻烦,因为MySQL将下降长期连接:

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 is before_request and teardown_request handlers, 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:

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

这篇关于使用Apache的mod_wsgi部署基于烧瓶应用程序时,MySQL连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆