首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django视图在Ajax请求期间不返回任何

Django视图在Ajax请求期间不返回任何
EN

Stack Overflow用户
提问于 2020-08-21 08:13:38
回答 1查看 457关注 0票数 0

我有一个Django web应用程序,我试图发出一个ajax调用来上传一个大图片。如果我能够上传我要上传的图像,我将使用pythonocc库读取图像并返回卷信息。由于这个过程需要很长时间,所以我尝试使用django-后台任务库来完成它。根据我所说的内容,我试图获取图像并将其发送到视图的ajax请求如下所示。

代码语言:javascript
复制
var data = new FormData();
var img = $('#id_Volume')[0].files[0];
data.append('img', img);
data.append('csrfmiddlewaretoken', '{{ csrf_token }}');
$.ajax({
  method: 'POST',
  url: '{% url 'data:upload' %}',
  cache: false,
  processData: false,
  contentType: false,
  type: 'POST',
  data: data,
}).done(function(data) {
});

我的观点是,在Ajax请求之后才能工作;

代码语言:javascript
复制
def uploadFile(request):
    if request.method == 'POST':
        file = request.FILES.get('img')
        filename = file.name
        key = 'media/' + filename
        s3_resource = boto3.resource('s3')
        bucket = s3_resource.Bucket('bucket')
        bucket.put_object(Key=key, Body=file)
        new_data = Data(author=request.user)
        new_data.save()
        data_id = new_data.id
        initial = CompletedTask.objects.filter(verbose_name=verbose)
        request.session['u_initial'] = len(initial)
        verbose = str(request.user) + '_3D'
        read_3D(data_id, key, filename, verbose_name = verbose) ###background-task function is called
        return redirect('data:uploadStatus')

调用此后台任务函数的视图也应该重定向视图,这将显示上传的状态。

代码语言:javascript
复制
def upload_status(request):
    customer= str(request.user)
    verbose = customer + '_3D'
    initial = request.session['u_initial']
    if request.is_ajax():
        running, completed = get_upload_status(verbose)
        context = {
        "initial": initial,
        "running": running,
        "completed": completed,
        }
        return JsonResponse(context)
    return render(request, "file_pending.html")

但是,当我提出Ajax请求时,视图给出了The view data.views.uploadFile didn't return an HttpResponse object. It returned None instead.错误,因为它没有进入if request.method == 'POST'条件。当我从视图中删除该条件行时,它无法获得img文件。顺便说一句,这个uploadFile视图运行时没有任何问题。奇怪的是,当我添加upload_status视图并重定向它时,它就停止工作了。为了恢复原状,我删除了这个部分,并将其还原回来,但它仍然没有工作。

我怎样才能解决这个问题?我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-21 08:49:53

A.您应该使用方法装饰将视图方法限制在预期的实际方法上

代码语言:javascript
复制
from django.views.decorators.http import require_POST

@require_POST
def uploadFile(request):
    file = request.FILES.get('img')
    filename = file.name
    key = 'media/' + filename
    s3_resource = boto3.resource('s3')
    # ....
    return redirect('data:uploadStatus')

这样,不使用POST的对此端点的调用将收到不允许响应的405方法。它更容易调试和澄清什么是错误的。

B.确保前面的Ajax调用遵循重定向。

POST不需要cache参数(除非您计划使用IE8)

关于contentType=falseprocessData=false:在我看来,这是一个常规的多部分格式调用。除非你知道你为什么要这样做,否则不要这样做。Django代码看起来会很好地处理常规表单数据,不需要修改默认行为。

C.您还必须实现一个错误回调:

代码语言:javascript
复制
}).done(function(data) {
}).fail(function(xhr, text, error) {
    console.log(text, error)
});

我想发生的是JS代码中没有处理的一些错误。

您没有添加设置,因此我无法确定,但我认为您没有正确地设置AJAX的CSRF配置。解决这个问题的一种方法是将cookie添加到AJAX请求中。CSRF表单字段和cookie都必须存在。

请参阅https://docs.djangoproject.com/en/3.1/ref/csrf/#ajax

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63519071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档