Django POST请求从我的观点从Pyres工作

我正在使用Pyres工作人员对表单中的数据用户进行一些处理。 他们的处理是通过我的表单上的视图完成的,我通过该表单进行POST请求,其中包含要处理的数据以及用户的CSRF中间件令牌。 我的问题是,这显然是不够的,因为Django仍然拒绝了我的要求,禁止403。

相关代码:

表单处理器:

def handler(request):
    if(request.method == "POST"):
        if(request.POST.__contains__("taskdata")):
            #valid post of the form
            taskdata = escape(request.POST.get("taskdata",""))
            t = TaskData(data=taskdata, time_added=timezone.now(), token=request.POST.get("csrfmiddlewaretoken",""))
            t.save()
            r = ResQ(server="127.0.0.1:6379")
            r.enqueue(TaskData, t.id)

            return HttpResponse(t.id)


        else:
            #invalid post of the form
            raise Http404
    else:
        raise Http404

Pyres工人工作:

    @staticmethod
    def perform(taskData_id):
        #Get the taskData from this id, test it for tasky stuff
        task_data = TaskData.objects.get(pk=taskData_id)

        post_data = [('id',task_data.id),('data',task_data.data), ('csrfmiddlewaretoken',task_data.token)]     # a sequence of two element tuples
        result = urllib2.urlopen('http://127.0.0.1:8000/tasks/nlp/process/', urllib.urlencode(post_data))
        content = result.read()
        return

查看被发布到该工作:

def process(request):
    if(request.method == "POST"):
        return HttpResponse("HEY, it works!")
        if(request.POST.__contains__("data") and request.POST.__contains__("id")):
            #valid post to the form by the model
            #taskdata = escape(request.POST.get("taskdata",""))
            #data = get_times(taskdata)
            return HttpResponse("Hey from process!")
            #return HttpResponse(json.dumps(data))

        else:
            #invalid post of the form
            raise Http404
    else:
        raise Http404

我基本上想要做的是在表单提交时保存一些原始数据,以及CSRF令牌。 工作人员然后将该数据+令牌发送到处理视图。

不幸的是,张贴令牌似乎不够。

有人知道csrf的保护究竟在寻找什么,以及如何让我的Pyres工作人员符合?

(建议标签:pyres)


我想我看到了问题。

Django CSRF保护的工作方式是生成一个随机数,然后将cookie设置为随机数的值,并确保csrfmiddlewaretoken POST值与cookie的值匹配。 其基本原理是它使它成为无状态的系统,没有任何持久的会话数据。

问题在于你在Pyres工作人员的工作中提出的请求...

result = urllib2.urlopen('http://127.0.0.1:8000/tasks/nlp/process/', 
                         urllib.urlencode(post_data))

...来自服务器,而不是客户端,所以它不会设置cookie。

假设/tasks/nlp/process/ URL受到保护,只能被服务器访问,那么使得process()视图免于CSRF检查可能是最简单的process()

@csrf_exempt
def process(request):
   ...

...否则,你将不得不手动获取handler()视图中的cookie值,并将其传递给Pyres worker作业。

更新

为了确保process()方法只能由服务器调用,一种简单的方法是使用类似于...的方式检查请求对象。

@csrf_exempt
def process(request):
    if request.META['REMOTE_ADDR'] != '127.0.0.1':
        # Return some error response here.
        # 403 is traditional for access denied, but I prefer sending 404
        # so 'hackers' can't infer the existence of any 'hidden' URLs
        # from the response code
        raise Http404
    # Now do the thing
    ....

...虽然可能有一些内置的装饰器或其他可以为你做的。

链接地址: http://www.djcxy.com/p/9681.html

上一篇: Django POST request to my view from Pyres worker

下一篇: id may not be NULL, django user registration