我正在编写一个使用我创建的REST API的Django应用。目的是通过网络应用程序来证明api用例。在我看来,因此我使用python-requests库调用api,如下所示:
def my_view_method(request):
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
data = form.cleaned_data
data_to_post = {
'fieldA': data.get('fieldA_in_form'),
'fieldB': data.get('fieldB_in_form'),
}
post_url = "http://%s/%s/" % (request.get_host(), 'entries')
logger.info("request api url: "+ post_url)
r = requests.post(post_url, data=data_to_post)
return HttpResponseRedirect('/')
else:
form = MyForm()
return render(request, 'myview.html', { 'form': form })
我已经使用单元测试验证了使用有效数据过帐到/entries/会导致正确的数据库更新。
url = '/entries/'
#verify initial db state
data = { 'fieldA': value1, 'fieldB': value2 }
response = self.client.post(url, data, format='json')
# verify db was updated
在我的功能测试中,我使用LiveServerTestCase并与Form进行交互。测试提交表单后,浏览器选项卡的标题中将显示“Connecting ...”,并且测试用例将挂起。当我直接与数据库进行交互而不是使用请求调用api时并非如此,因此这一定是造成延迟的原因。
关于LiveServerTestCase的工作方式,我在这里不了解吗?
最佳答案
难道LiveServerTestCase服务器一次只能处理一个请求?因此挂起是因为它无法处理请求中的请求?
The source说它将“一次处理一个请求”,但随后又说“无阻塞”,因此模棱两可...
我认为您最好删除LiveServerTestCase并滚动自己的测试运行程序。您可以使用setUp在单独的过程中启动runserver
,并使用tearDown
重置数据库(manage.py flush
?)。如果要使用测试数据库,则可以使用其他settings.py,或在测试期间将“真实”数据库移开。