2011-11-30 10 views
14

エラーは、私はジャンゴのバージョン1.3を持っている場所http://127.0.0.1:8000/fileupload/form.pyジャンゴ:CSRFトークン見つからないか、間違った

です。私はlocalhost:8000を指定しようとしましたが、他の人の質問に記載されていますが、これは私のためには機能しませんでした。私はファイルアップロードフォームを取得しようとしていますが、form.pyにCSRFトークンがないというエラーが表示されています。

form.py:

class UploadFileForm(forms.Form): 

    title = forms.CharField(max_length=50) 
    file = forms.FileField() 

views.py:

def upload_file(request): 

    c = {} 
    c.update(csrf(request)) 

    if (not request.user.is_authenticated()) or (request.user == None): 
     return HttpResponseRedirect("/?error=11") 


    if request.method == 'POST': 
     form = c['UploadFileForm'] = UploadFileForm(request.POST, request.FILES, c, context_instance=RequestContext(request)) 

     if c['UploadFileForm'].is_valid(): 
     handle_uploaded_file(request.FILES['file']) 
     return HttpResponseRedirect('/success/url/') 

    else: 
     form = c['UploadFileForm'] = UploadFileForm() 
    return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']}) 

upload.html:私は非常にしようとする私にいくつかのことを教えてください困惑しています

{% block main_content %} 


    <form action="fileupload/form.py" enctype="multipart/form-data" method="POST"> 
    {% csrf_token %} 
    <table> 

     <tr><td>Title:</td><td><input type="text" name="title" /></td></tr> 
     <tr><td>File:</td><td><input type="file" name="file" /></td></tr> 
    </table> 
     <input type="submit" value="Submit" class = "float_right button_input" /> 

    </form> 

{% endblock main_content %} 

。 (views.py

from django.template import RequestContext 

... 

return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']}, RequestContext(request)) 
# Added RequestContext 

このテンプレートにCSRFのトークンを渡し:あなたはこのためにcsrf_token

ためrender_to_responseにRequestContextを渡す必要があり

答えて

29

ありがとうございました。

+0

あなたが既に持っている: ではこのような場合は、CSRFトークンを必要とする任意のビューであなたが デコレータ最初django.views.decorators.csrf.csrf_protect()を使用する必要があります 挿入しますあなたのテンプレートで '{%csrf_token%}'を使用しました。これはうまくいくはずです。 –

+0

RequestContextを追加しました型エラーが発生しました__init __()は予期せぬキーワード引数 'context_instance'を持っています – user1072646

+0

ありがとう、私はただ考え出しました。あなたが言ったように、RequestContext(request)を追加していました。そしてif文からcとcontext_instance =を取り除いていました。あなたがそれを含むようにあなたの答えを変更するなら、私はそれが正しいとマークします。 – user1072646

0

私の答えは上記の@Yugal Jindleの答えと似ています。

私はDjangoの1.10を使用していますが、私は同様の問題を持っていた、それは

return render_to_response(param1, param2) 

return render(request, param1, param2) 

P.S.を編集した後、私のために働きましたあなたは@cache_page(60 * 15)デコレータを使用する場合にも発生する可能性がsettings.pyに

'django.middleware.csrf.CsrfViewMiddleware' 
0

をごミドルウェア変数に以下の行があることを確認してください。 CSRFトークンを含むフォームでページをキャッシュすると、最初のユーザーのCSRFトークンのみがキャッシュされます。だから時々デバッグするのは難しいです。 Django documentation

から

詳細情報csrf_tokenテンプレートタグは、テンプレートで使用されている(またはget_token 機能は、他の方法と呼ばれている)場合は、CsrfViewMiddlewareは クッキーを追加し、 多分:応答へのCookieヘッダー。これは、 指示(UpdateCacheMiddlewareが他のすべてのミドルウェアの前にあります)として使用される場合、 ミドルウェアがキャッシュミドルウェアでうまくいくことを意味します。あなたは個々のビューにキャッシュデコレータを使用している場合

しかし、CSRF ミドルウェアはまだインクルードヘッダーまたは CSRFクッキーをヴァリ設定することができたではないだろう、と応答は1のいずれかなしにキャッシュされます。

from django.views.decorators.cache import cache_page 
from django.views.decorators.csrf import csrf_protect 

@cache_page(60 * 15) 
@csrf_protect 
def my_view(request): 
    ... 
関連する問題