Django评论 - Ajax和CSRF失败

时间:2011-07-05 10:16:48

标签: jquery ajax django json csrf

我认为这与其他问题不同,我已经检查了答案,但仍然没有运气。谢谢你的帮助:

我有一个新闻项目列表(比如Facebook提要),并且每个都附有一个评论表单(使用django.contrib.comments应用程序)。它通常工作正常。

但是,我在页面上使用了一种AJAX'无限滚动' - 滚动时,它会通过AJAX加载下一组新闻项目和相关评论表单。新加载的新闻项目上的评论表单不起作用(CSRF验证失败)。

很明显为什么 - {%csrf_token%}未传递给返回的JSON响应,因此新加载的注释表单没有CSRF数据。

我尝试在Django页面上使用set cookie方法(https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#ajax),但似乎无法正常工作尝试@csrf_exempt装饰器完全排除CSRF。

有关如何将csrf_token与返回的JSON响应一起传递的任何建议吗?还是有替代方案吗?

以下是观点:

def my_view(request):
    # the normal view gets a queryset of all Info items and returns them
    infos = Info.objects.all()
    ....

    # here's the AJAX part
    if request.GET.get('xhr') and page > 1:
        infos = paginator.page(int(request.GET.get('page')))
        objects_list = []
        for object in infos:
            objects_list.append(render_to_string('list/snippets/feed_li.html', {
                'object': object,
            }))

        json =  simplejson.dumps(objects_list, cls=DjangoJSONEncoder)
        return HttpResponse(json, mimetype='application/json')

2 个答案:

答案 0 :(得分:0)

一个选项是通过您返回的JSON响应向表单提供CSRF令牌。我相信您可以通过调用django.middleware.csrf.get_token(request)以编程方式获取CSRF令牌,然后在您的ajax响应中包含该值。

我能想到的另一个选择是禁用该视图的CSRF保护。

答案 1 :(得分:0)

首先检查您是否忘记在'list / snippets / feed_li.html'中添加{%csrf_token%};

其次,要使csrf令牌功能正常,您必须使用RequestContext或手动生成令牌,并在呈现模板时将其添加到上下文变量中(请参阅Django csrf ref)。因此,替换以下行:

objects_list.append(render_to_string('list/snippets/feed_li.html', {
    'object': object,
}))

使用:

''' from django.template import RequestContext ''' 
objects_list.append(render_to_string('list/snippets/feed_li.html', \
    RequestContext(request, {'object':object})
))

或:

''' from django.core.context_processors import csrf '''
vars = {}
vars.update(csrf(request))
vars.update({'object':object})
objects_list.append(render_to_string('list/snippets/feed_li.html', vars))