2017-10-06 6 views
0

メディアファイルの要求を処理するカスタムビューを作成するときに問題が発生しました。私はそれをカスタマイズして、カスタムの権限チェックと上書きを行うことができるようにしました。ファイルを取得するときにdjangoビューがHttpResponseオブジェクトを返さない

url(r'^media/(?P<path>.*)$', views.document_view, {'document_root': settings.MEDIA_ROOT}), 

@login_required 
def document_view(request, path, document_root): 

    name = os.path.join(settings.MEDIA_ROOT, path) 
    if not os.path.isfile(name): 
     raise Http404("File not found.") 
    if request.user.is_staff: 
     print "staff" 
     serve_document(request, path) 
    else: 
     print "FORBIDDEN" 
     raise PermissionDenied 

def serve_document(rcvd_request, path): 

    print "Send " + path 
    # set PRIVATE_MEDIA_USE_XSENDFILE in your deployment-specific settings file 
    # should be false for development, true when your webserver supports xsendfile 
    # This is currently zero 
    if settings.PRIVATE_MEDIA_USE_XSENDFILE: 

     response = HttpResponse(mimetype='application/force-download') 
     response['X-Accel-Redirect'] = filename # Nginx 
     response['X-Sendfile'] = filename # Apache 2 with mod-xsendfile 
     del response['Content-Type'] # let webserver regenerate this 
     return response 
    else: 
     print "Fallback serve" 
     # fallback method   
     return serve(rcvd_request, path, settings.MEDIA_ROOT) 

    return serve(request, path, path, settings.MEDIA_ROOT) 

私がリンクされたファイルを持っているリンクをクリックすると、私はインクルードは、右のパスで呼び出さ奉仕知っているので、これはあまり意味がありません

The view portal.views.dashboard.document_view didn't return an HttpResponse object. It returned None instead. 

、ファイルを取得実際には、スタッフチェックのない以前のバージョンでファイルをダウンロードしていました。 デフォルトでは、インデントと機能が[なし]で終了するために問題が発生していますが、これは当てはまりません。

+0

私はそれを考え出したかもしれないと思います。私がserve_document関数を呼び出すと、serve_documentの戻り値が先頭に伝播しないので、returnを追加する必要があります – user8734958

答えて

0

の次の行に:

serve_document(request, path) 

Djangoビューでは、HttpResponseが返されます。しかし、この行は何も返されません。 serve_documentによって返された応答は何も割り当てられておらず、返されません。

したがって、あなたはそれを変更する必要があります。

return serve_document(request, path) 

か、それがより明確にする:

http_response = serve_document(request, path) 
return http_response 
関連する問題