Почему я получаю эту ошибку в Django (я пытаюсь сделать 304 без изменений) - PullRequest
0 голосов
/ 25 февраля 2010
def list_ajax(reqest):
    #q = request.GET.get('q',None)
    #get all where var = q.
    return ...
list_ajax = condition(etag_func=list_ajax)(list_ajax)

Как видите, я пытаюсь вернуть 304 клиенту, если результат такой же. Но я получаю эту ошибку Django, почему?:

Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  92.                 response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/views/decorators/http.py" in inner
  130.                 response['ETag'] = quote_etag(res_etag)
File "/usr/local/lib/python2.6/dist-packages/django/utils/http.py" in quote_etag
  118.     return '"%s"' % etag.replace('\\', '\\\\').replace('"', '\\"')

Exception Type: AttributeError at /list/ajax/
Exception Value: 'HttpResponse' object has no attribute 'replace'

Редактировать: я сделал это:

def etag_generate(p):
    thestring =  cPickle.dumps(p)
    return thestring

@etag(etag_generate)
def list_ajax(request):
    ...
    etag_generate(mydictresults)
    return render_to_response("list.html",mydictresults)

Я превращаю все результаты в строку, надеясь, что из этого словаря можно сгенерировать хеш. Но, похоже, @etag не позволит мне сгенерировать cPickle. Ошибка:

Exception Type: TypeError at /list/ajax/ 
Exception Value: can't pickle file objects

Ответы [ 2 ]

0 голосов
/ 25 февраля 2010

Исправлено.

Передал запрос в.

def list_ajax_etag(request):
    return str(request.GET.get('l',''))+str(request.GET.get('a',''))
0 голосов
/ 25 февраля 2010

Правильный etag_func вернет некоторые сериализуемые данные. В вашем случае лучшим выбором будет что-то вроде этого:

@etag(_get_list)
def list_ajax(request):
    objects = _get_list(request)
    return render_to_response("list.html", {"objects": objects})

def _get_list(request):
    q = request.GET["q"]
    # find and return records here
    # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...