flask-restless与mod_wsgi无法连接MySQL服务器
我正在尝试在Apache服务器上使用mod_wsgi运行一个flask-restless应用。这个应用在开发服务器上运行得很好。我查阅了很多资料,但没有找到能解决我问题的答案。这个应用能正确处理不需要数据库的请求,但当我尝试访问一个需要数据库的链接时,就出现了以下错误:
OperationalError: (OperationalError) (2003, "无法连接到本地的MySQL服务器([Errno 13] 权限被拒绝)") None None
我把代码简化到了基本的flask-restless快速入门版本,并且导入了我的config
文件和flask-sqlalchemy模型(from flask import models
)。以下是我的Python代码:
import flask
import flask.ext.sqlalchemy
import flask.ext.restless
import sys
sys.path.insert(0, '/proper/path/to/application')
application = flask.Flask(__name__, static_url_path = "")
application.debug=True
application.config.from_object('config')
db = flask.ext.sqlalchemy.SQLAlchemy(application)
from app import models
# Create the Flask-Restless API manager.
manager = flask.ext.restless.APIManager(application, flask_sqlalchemy_db=db)
# Create API endpoints, which will be available at /api/<tablename> by
# default. Allowed HTTP methods can be specified as well.
manager.create_api(models.Asset, methods=['GET'])
# start the flask loop
if __name__ == '__main__':
application.run()
我认为mod_wsgi应该能找到包含数据库访问信息的config
文件,因为我在读取配置时没有遇到错误,而且在from app import models
时也没有错误。
到目前为止,我的研究让我相信,这个问题可能与sql-alchemy数据库连接存在于错误的作用域或上下文有关,可能还受到flask-restless API管理器的影响。我对此有点搞不清楚。
1 个回答
在Apache/mod_wsgi下运行的代码会以一个特殊的Apache用户身份运行。这个用户可能没有连接数据库所需的权限。
虽然你看到的是'localhost',你可能会觉得这意味着可以正常连接,但有些数据库客户端看到'localhost'后,会自动尝试使用UNIX套接字来连接数据库。这个Apache用户可能没有权限访问这个UNIX套接字。
另外,当通过UNIX套接字连接时,系统会检查Apache用户是否有权限访问,但如果数据库没有设置允许这个Apache用户访问,那么连接就会失败。
可以考虑使用mod_wsgi的守护进程模式,并配置这个模式以一个不同于Apache用户的用户身份运行,这个用户你知道是可以访问数据库的。