Django从外部源接收json post请求

时间:2016-05-24 09:14:27

标签: python json django labview

我编写了一个视图函数来处理包含来自django(labview)之外的源的json数据的post请求。我只是开始测试它所以看起来像这样

def post_entry(request):
    '''Process incoming json string
    '''

    if request.method == 'POST':

        post_data = request.body

    # Return a response
    return HttpResponse('data received OK')

我已经写了一个测试来测试这个并且通过正常:

def test_post_entry_view_good_post_data(self):
    '''post_entry view should return a 200 status if valid
    '''

    data = {'DHTP Data': ['10', '50.296', '50.94', '50.418', '50.425', '50.431', '50.94'],
        'Test String': 'My Test String'}

    request_url = reverse('post_entry') 
    response = self.client.post(request_url, content_type='application/json', 
        data=dumps(data))

    # Should return a 200 response indicating ok
    self.assertEqual(response.status_code, 200)

但是当labview发布数据时,post_entry会返回403禁止错误。我想这是因为没有csrf令牌存在,但为什么测试在这种情况下通过?

3 个答案:

答案 0 :(得分:3)

测试客户端围绕CSRF功能工作。见https://docs.djangoproject.com/en/1.9/ref/csrf/#testing

答案 1 :(得分:2)

如果您的视图接受来自应用外部来源的帖子数据,则需要使用csrf_exempt使您的视图免于CSRF保护:

@csrf_exempt
def post_entry(request):
    '''Process incoming json string
    '''

如果您要这样做,您应该使用其他一些验证请求的方法

答案 2 :(得分:2)

如果您的视图应该接受来自外部源的POST,那么您需要验证请求,因为每个POST请求都需要具有CSRF令牌(请参阅:CSRF) 。因此,出于您的目的,您必须使用@csrf_exempt装饰器免除CSRF验证的视图,并使用类似Token Authentication

的内容为请求编写您自己的验证