我在使用mod_wsgi
部署的简单flask-zodb应用中使用Flask时遇到问题。
每次我尝试使用DB作为示例设置默认值:
from flaskext.zodb import zodb, List
db = ZODB(app)
app.config.from_pyfile('settings.py') # here I have defined ZODB_STORAGE = "/home/username/webapps/myapp/htdocs/Data.fs"
@app.before_request
def set_db_defaults():
if 'entries' not in db:
db['entries'] = List()
或在以下视图中:
@app.route('/add', methods=['POST'])
def add_entry():
db['entries'].append(request.form)
flash('New entry was successfully posted')
return redirect(url_for('show_entries'))
我收到以下错误:
[Sat May 19 16:52:30 2012] [error] [client 127.0.0.1]
self._lock_file = LockFile(file_name + '.lock')
[Sat May 19 16:52:30 2012] [error] [client 127.0.0.1] File
"/home/userame/.virtualenvs/myapp/lib/python2.7/site-packages/zc/lockfile/__init__.py",
line 76, in __init__
[Sat May 19 16:52:30 2012] [error] [client 127.0.0.1] _lock_file(fp)
[Sat May 19 16:52:30 2012] [error] [client 127.0.0.1] File
"/home/username/.virtualenvs/myapp/lib/python2.7/site-packages/zc/lockfile/__init__.py",
line 59, in _lock_file
[Sat May 19 16:52:30 2012] [error] [client 127.0.0.1] raise
LockError("Couldn't lock %r" % file.name)
[Sat May 19 16:52:30 2012] [error] [client 127.0.0.1] LockError:
Couldn't lock '/home/username/webapps/myapp/htdocs/Data.fs.lock'
该应用程序在开发环境中运行良好,我认为自从我尝试设置以来没有预设问题:
ZODB_STORAGE = "/tmp"
提出了同样的例外。我无法理解为什么会发生这种情况以及如何避免这种错误。有什么想法吗?
答案 0 :(得分:5)
您正尝试从多个进程中打开ZODB;大概在开发中你只使用一个WSGI进程。这基本上是zc.lockfile.LockError in ZODB的欺骗。
您的选择是:
将您的生产环境限制为仅一个流程。
使用ZEO,参见引用的问题; zodburi equivalent为zeo://localhost:9100
。
使用RelStorage。如果RelStorage egg可用,您可以使用ZConfig URI scheme进行连接。这在old repoze.zodbconn
name。