【问题标题】:Django receiving json post request from external sourceDjango从外部源接收json post请求
【发布时间】:2016-05-24 09:14:26
【问题描述】:

我编写了一个视图函数,它处理包含来自 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 令牌存在,但是为什么在这种情况下测试通过了?

【问题讨论】:

    标签: python json django labview


    【解决方案1】:

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

    【讨论】:

    • 感谢是完全有道理的!
    【解决方案2】:

    如果您要拥有一个接受来自应用外部源的发布数据的视图,您需要使用 csrf_exempt 使您的视图免受 CSRF 保护:

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

    如果你打算这样做,你应该使用其他方法来验证请求

    【讨论】:

      【解决方案3】:

      如果您的视图应该接受来自外部来源的POST,则需要您验证请求,因为每个POST 请求都需要有一个CSRF 令牌(请参阅:CSRF)。因此,出于您的目的,您必须使用 @csrf_exempt 装饰器将视图从 CSRF 验证中排除,并使用 Token Authentication 之类的方式编写您自己的请求验证

      【讨论】:

        猜你喜欢
        • 2018-09-22
        • 1970-01-01
        • 2020-12-25
        • 2020-04-16
        • 2010-12-16
        • 2017-07-10
        • 2019-01-06
        • 2018-10-04
        • 2016-06-12
        相关资源
        最近更新 更多