Django从外部源接收json post请求

8oomwypt  于 2023-02-17  发布在  Go
关注(0)|答案(4)|浏览(140)

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

fwzugrvs

fwzugrvs1#

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

ruarlubt

ruarlubt2#

如果您打算让视图接受来自应用外部来源的发布数据,则需要使用csrf_exempt使视图免受CSRF保护:

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

如果要执行此操作,则应使用其他方法验证请求

mjqavswn

mjqavswn3#

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

1tuwyuhd

1tuwyuhd4#

使用这一行获取绕过CSRF保护所需的装饰器:

from django.views.decorators.csrf import csrf_exempt

然后将@csrf_exempt装饰器放在函数之前的行。

相关问题