在 Django 应用程序上工作并从我的 JS 代码间歇性地运行到
failed to fetch
错误。
您可以看到下面的网络响应 - 服务器的错误是间歇性的(当前在 localhost:8000 上)
我的 django 服务器日志没有显示任何内容 - 所以“连接被拒绝”和“空响应”令人困惑。
在我使用的 JS 方面
fetch(data.getAttribute('action'), {
method: data.getAttribute('method'),
body: new FormData(data),
headers:{ "X-CSRFToken": csrf_token, "X-Requested-With": "XMLHttpRequest"},
}).then(res=>res.json())
.then(function (data) {
console.log(data)
document.getElementById('create-submit-button').style.border = "2px solid #ebebeb"
if(data.status == 'success'){
//happy path will be to add photos on good response
console.log('happy path')
} else {
Swal.fire({
icon: 'error',
title: 'there was an issue with your request',
text: data.message,
})
}
})
.catch(error => console.log('Error: ', error))
}
我的django视图如下:
@login_required(login_url='login')
def create(request):
if request.method == "POST":
if request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' and request.user.is_authenticated:
print(request.POST)
form = SpinForm(request.POST)
if form.is_valid():
user = request.user
spin = Spin()
spin.prompt = form.cleaned_data['prompt']
spin.user = user
spin.orientation = form.cleaned_data['orientation']
# save spin to get many to many relationship
spin.save()
spin.themes.add(*form.cleaned_data['themes'])
# update users total spins
user.current_spins += 1
user.save()
# themes = request.POST.getlist('theme')
computed_prompt = ''
if len(spin.themes.all()) > 0:
for theme in spin.themes.all():
computed_prompt += ' ' + theme.prompt_text
# save spin again after attaching themes + computed prompt
spin.computed_prompt = computed_prompt
spin.final_prompt = spin.prompt + ' ' + computed_prompt
spin.save()
try:
ThirdPartyApi.spin(request.user, spin)
except Exception as e:
print('%s' % type(e))
print(e)
return JsonResponse({
'status': 'failed',
'message': 'stable-d shit'
})
# stable d api shit right here
return JsonResponse({
'status': 'success',
'spin': 'win'
})
else:
print(form.errors.as_data())
return JsonResponse({
'status': 'failed',
'message': str(form.errors.as_data())
})
else:
return JsonResponse({
'status': 'failed',
'message': 'non ajax or user not logged in',
})
else:
spin = SpinForm()
themes = Theme.objects.all().order_by('created_at')
context = {
'form': spin,
'themes': themes
}
return render(request, 'templates/create/create.html', context)
我确实调用了一个
ThirdPartyApi
,它使用 GRPC 并需要一些时间来计算(AI api)。话虽这么说,我真的对它工作/不工作的间歇性感到恼火。非常感谢解决无法获取问题的任何提示。
对于遇到此问题的任何其他人 - 我遇到了 django 开发服务器的限制。一旦我切换到 nginx + gunicorn,问题就完全消失了。如果 django 开发人员在它爆炸时能吐出一些东西,那就太好了。原来它也是单线程的,我正在做一堆可能有一些清理的图像处理,所以线程保持锁定。使用 nginx + 一个 w/asgi 服务器!