我正在使用Pyres工作人員做一些處理數據用戶在窗體中輸入。他們的處理是通過我的表單上的視圖完成的,我通過該表單進行POST請求,其中包含要處理的數據以及用戶的CSRF中間件令牌。我的問題是,這顯然是不夠的,因爲Django仍然拒絕了我的要求,禁止403。Django POST請求從我的觀點從Pyres工人 - CSRF令牌
相關代碼:
表單處理程序:
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
柴堆工人的工作:
@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)
什麼是handler()函數? Django視圖,中間件功能還是其他? – Aya 2013-05-01 16:27:17
對不起,handler()是一個Django視圖。它位於通過表單發佈到的URL上。process()也是一個視圖,同樣一個可預測的URL(我的工作者perform()方法在那裏發佈)。 perform()方法是Pyres使用的模型類上的方法。 – 2013-05-01 16:32:00