2

でデプロイされた単純な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()

または次のようなビューで:

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

そして、同じ例外が発生します。なぜこれが起こるのか、そしてこの種のエラーを回避する方法がわかりません。何か案は?

4

1 に答える 1

5

複数のプロセスからZODBを開こうとしています。おそらく開発では、1つのWSGIプロセスのみを使用します。これは基本的に、ZODBのzc.lockfile.LockErrorの複製です。

オプションは次のとおりです。

  1. 実稼働環境を1つのプロセスのみに制限します。

  2. ZEOを使用してください。参照されている質問を参照してください。zodburiに相当するものはですzeo://localhost:9100

  3. RelStorageを使用します。RelStorage egが利用可能であれば、ZConfigURIスキームを使用して接続できます。これは、RelStorageのドキュメントに古いrepoze.zodbconn名前で記載されています。

于 2012-05-21T09:25:53.110 に答える