2013-01-17 54 views
3

在我的项目中有一个问题。不要上传文件。这里是我的代码不要通过nginx上传文件帮助上传模块

配置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。我不知道为什么。 我views.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不允许”。谁能说为什么会出现这个问题?

回答

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 
0

try:remove string internal;
in location/file-upload
如果请求的方法不是POST,模块将返回错误405(方法不允许)。使用这种方法的请求可以通过error_page指令在其他位置处理。 more info