LockError使用flask-zodb

rab*_*ben 2 python zodb flask

我在使用部署的简单Flask应用程序中使用flask-zodb时遇到问题.每次我尝试使用DB作为示例设置默认值:mod_wsgi

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()
Run Code Online (Sandbox Code Playgroud)

或者在以下视图中:

@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'))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

[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'
Run Code Online (Sandbox Code Playgroud)

该应用程序在开发环境中工作正常,我认为没有预先设置问题,因为我试图设置:

ZODB_STORAGE = "/tmp"
Run Code Online (Sandbox Code Playgroud)

并且提出了同样的例外.我无法理解为什么会发生这种情况以及如何避免这种错误.有任何想法吗?

Mar*_*ers 5

您正尝试从多个进程打开ZODB; 大概在开发中你只使用一个WSGI进程.这基本上是ZODBzc.lockfile.LockError的欺骗.

你的选择是:

  1. 将您的生产环境限制为仅一个流程.

  2. 使用ZEO,参见引用的问题; 该zodburi相当于zeo://localhost:9100.

  3. 使用RelStorage.如果RelStorage egg可用,您可以使用ZConfig URI方案进行连接.这在repoze.zodbconn名称下的RelStorage文档中有记录.