2

Django アプリを 1.6 から 1.7 にアップグレードしています。アプリはdjango-cacheopsクエリの結果を保存するために使用します。Django 1.7 に切り替えた後、最初のリクエストを除くすべてのリクエストで次のエラーが発生します。

Traceback (most recent call last):
  File "/data/virtualenv/default/lib/python2.7/site-packages/django/core/handlers/base.py", line 204, in get_response
    response = middleware_method(request, response)
  File "/data/virtualenv/default/lib/python2.7/site-packages/tracking/middleware.py", line 131, in process_response
    visitor = self._refresh_visitor(user, request, now)
  File "/data/virtualenv/default/lib/python2.7/site-packages/tracking/middleware.py", line 60, in _refresh_visitor
    visitor = Visitor.objects.get(pk=session_key)
  File "/data/virtualenv/default/lib/python2.7/site-packages/cacheops/query.py", line 398, in get
    return self.get_queryset().inplace().get(*args, **kwargs)
  File "/data/virtualenv/default/lib/python2.7/site-packages/cacheops/query.py", line 295, in get
    return qs._no_monkey.get(qs, *args, **kwargs)
  File "/data/virtualenv/default/lib/python2.7/site-packages/django/db/models/query.py", line 353, in get
    return clone._result_cache[0]
AttributeError: 'list' object has no attribute '_result_cache'

AttributeErrorを上げた場合はclone単一項目のlist ですが、その list となるdjango.db.models.query属性です_result_cache

そのdjango-cacheops関数を呼び出すメソッドでは、 self型はCacheQuerySet.

私の疑いでは、この問題の原因は、djangoコードがQuerySetオブジェクトを期待しており、アヒルCacheQuerySetが の期待に完全に一致していないことですQuerySet

また、何かが正しく構成されていない可能性もあります。関連する設定は次のとおりです。

CACHEOPS_REDIS = {
    'host': 'localhost',
    'port': 6379,
    'db': 10,
    'socket_timeout': 3,
}

CACHEOPS = {
    'core.vantageuser': {'ops':'count', 'timeout':60*2},
    'core.banditarm': {'ops':'all', 'timeout':60*2},
    'core.armmembership': {'ops':'all', 'timeout':60*60*2},
}

CACHEOPS_FAKE = False
CACHEOPS_DEGRADE_ON_FAILURE = True

これは、に報告する必要がある実際の問題django-cacheopsですか? 問題を回避するためのアイデアはありますか (設定以外CACHEOPS_FAKE=True)?

[編集]:

私の友人は、最小限の repo で問題を再現することができましたdjango-tracking2問題はパッケージに起因するようです。

まだ解決策はありませんが、それに取り組んでいます。

4

1 に答える 1

1

確かに、構成に次の'ops':'count'ように綴る必要があるエラーがあります'ops':['count'](人々はとにかくこれを行うので、次のバージョンの cacheops はそれを理解します)。ただし、これによってエラーが発生することはありません。

あなたの問題は、ほとんどの場合、cacheops がQuerySet. そのため、モンキーがパッチを適用したりサブクラス化したりしていないか確認してください。__getitem__()改ざんされている場合は特に注意してください。

これがどこから来ているのかわからない場合は、プロジェクトを「めちゃくちゃ」解体することをお勧めします。すべてが機能し始めるまで、サードパーティのアプリとコードを削除してから、最後のステップに注意してください。それでもうまくいかない場合は、github で問題を作成し、そこにプロジェクトの残りを添付することができます。

于 2015-02-04T02:53:33.300 に答える