3

在我的项目中出现了问题。不要上传文件。这是我的代码

配置 nginx

server{

listen 9000;
server_name localhost;
root  /home/path/my/project;

location ~ ^/(static|media)/ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
}

location /file-upload {
    internal;
    upload_pass /upload-file/;
    upload_store /home/payh/my/project/media/video;
    upload_max_file_size 250m;

    upload_set_form_field $upload_field_name.name "$upload_file_name";
    upload_set_form_field $upload_field_name.content_type "$upload_content_type";
    upload_set_form_field $upload_field_name.path "$upload_tmp_path";

    upload_pass_form_field "^csrfmiddlewaretoken$";

    upload_limit_rate 2m;
    track_uploads upload 1m;
}

location = /upload/progress {
    report_uploads upload;
}

location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 10;
    proxy_read_timeout 10;
    proxy_pass http://localhost:8000/;
}
error_page 500 502 503 504 /media/50x.html;
}

单击按钮上传后,请求由 nginx_accel 进入函数。然后查看为 nginx 创建响应并发送。不允许 Nginx 返回 405。我不知道为什么。我的意见.py

@login_required
@csrf_protect
def upload(request):
    context = RequestContext(request)

    if request.method == 'POST':
        pathfile = request.POST.get('upfile.path')
        upfile   = open(pathfile, 'r')
        file = File(upfile)

        form = NewFileForm(request.POST, initial={'upfile':file})
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse(upload))
    else:
        form = NewFileForm()

    return render_to_response('upload.html', 
                          {'form':form},
                           context_instance=context)    
@login_required
@csrf_protect
def nginx_accel(request):
    if request.user.id == 1:
        file = request.FILES.get('upfile').name
        url = '/'.join(['/file-upload', file])
        response = HttpResponse()

        response['Content-Type']= ''
        response['X-Accel-Redirect'] = url

        return response

浏览器中的 Nginx 返回“405 不允许”。谁能说出为什么会出现这个问题?

4

2 回答 2

0

尝试:删除字符串内部;
在 location /file-upload
如果请求具有 POST 以外的方法,则模块返回错误 405(不允许使用方法)。可以通过 error_page 指令在其他位置处理使用此类方法的请求。 更多信息

于 2013-03-23T05:42:22.427 回答
0

错误的原因是这个file = request.FILES.get('upfile').name。它将绕过并尝试在 POST 请求上提供静态文件,从而导致 405 错误。解决您的问题。

@login_required
@csrf_protect
def nginx_accel(request):
    if request.method == 'GET':
        if request.user.id == 1:
            file = request.GET.get('upfile').name
            url = '/'.join(['/file-upload', file])
            response = HttpResponse()

            response['Content-Type']= ''
            response['X-Accel-Redirect'] = url

            return response
于 2013-03-18T10:02:00.180 回答