我为什么在Django中遇到这个错误(我尝试做304未修改)
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
正确的 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
# ...
0
解决了。
请求已经提交。
def list_ajax_etag(request):
return str(request.GET.get('l',''))+str(request.GET.get('a',''))