-1

この記事を読みましたhttp://eshlox.net/en/2012/09/13/sphinxsearch-and-django-ubuntu/

ビューでは、コードのエラーが発生します: total = query_results['total']

エラー: 'NoneType' オブジェクトに属性 ' getitem ' がありませ

def search(request):
    if request.GET:
        form = SearchForm(request.GET)
        query = request.GET.get('q', '')
        s = SphinxClient()
        s.SetServer('localhost', 9312)
        s.SetLimits(0, 16777215)
        if s.Status():
            query_results = s.Query(query)
            total = query_results['total']
            pages_id = [page['id'] for page in query_results['matches']]
            if pages_id:
                results = Page.objects.filter(id__in=pages_id)
            else:
                results = None
            if results:
                paginator = Paginator(results, 25)
                page = request.GET.get('page')
                try:
                    results = paginator.page(page)
                except PageNotAnInteger:
                    results = paginator.page(1)
                except EmptyPage:
                    results = paginator.page(paginator.num_pages)
            return render(request, 'wiki/search.html',
                          {'results': results,'total': total,
                           'query': query, 'form': form})
        else:
            logger = logging.getLogger('helper')
            logger.error('Sphinxsearch Error! %s' % s.GetLastError())
            messages.add_message(request, messages.ERROR, 'Search server is '
                                 'not responding. Administrator '
                                 'has been informed.')
            form = SearchForm()
            return render(request, 'wiki/search.html', {'form': form})
    else:
        form = SearchForm()
        return render(request, 'wiki/search.html', {'form': form})

トレースバック コピー アンド ペースト ビューへの切り替え

/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in

get_response

                        response = wrapped_callback(request, *callback_args, **callback_kwargs)

    ...
▶ Local vars
/home/max/askmoiseev/ask/views.py in search

              total = query_results['total']

    ...
▶ Local vars

エラーの原因を教えてください。

4

2 に答える 2

4

あなたのクエリ結果は None だと思います

query_results = s.Query(query)

なのでアクセスしようとすると

total = query_results['total']

__getitem__None はリストではないため、エラーが発生します。

これが通訳者の例です。

>>> n = None
>>> n['b']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object has no attribute '__getitem__'
>>> 

シェルでクエリを実行してみてください -django-admin.py shell次に

s = SphinxClient()
s.SetServer('localhost', 9312)
s.SetLimits(0, 16777215)
query_results = s.Query(query)

がんばれ、サム

于 2014-06-01T16:26:57.270 に答える
0

query_results を使用する前に、GetLastError とおそらく GetLastWarning をチェックして、クエリが成功したことを確認する必要があります。

クエリが失敗した理由を見つけるボーナス。API が失敗時に適切な例外を発生させた方が良いかもしれませんが、そうではありません。

別のポイントとして、あなたの setLimits はとてつもなく高く、あまりにも多くの結果を取得しようとして失敗する可能性は十分にあります。

実際には、すべての ID を取得してからページングするのではなく、現在のページの ID のみを取得して、Sphinx で直接ページングを行う必要があります。

于 2014-06-02T09:56:08.230 に答える