1

MySQL データベースにデータを追加できる単純な Web サイトを構築しようとしています。2 つのテキスト入力 (ユーザー名、パスワード) を含む POST フォームがあります。関連するすべての回答を読み、解決しようとしましたが、成功しませんでした。

index.html

<form action="/login/" method="post">{% csrf_token %}<table border="0" cellspacing="15" width="345" align="center">
<tr>
    <td width="100" >Username:</td>
    <td><input type="text" class="text-box" value="{{ username }}" placeholder="Username"/></td>                        
</tr>
<tr>
    <td class="align-left">Password:</td>
    <td><input type="password" class="text-box" value="" placeholder="Password"/></td>                        
</tr>                    
<tr>
    <td class="align-left"></td>
    forget-link"><a href="#" >Forget Your Passowrd?</a></td>                        
</tr>                    

ビュー.py

def login(request):

    logout(request)
    username = password = ''
    if request.method :
        username = request.POST['username']
        password = request.POST['password']     
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect('/main/')
    return render(request, 'index.html',{ 'username': username})

urls.py

urlpatterns = patterns('',      

    url(r'^login/', 'mysite.views.login', name='login'),
)

index.html の form タグの後に {% csrf_token %} を適用しました。

ログインボタンをクリックすると、以下のエラーが表示されます。

CSRF verification failed. Request aborted.

4

2 に答える 2

3

問題は、テンプレートでタグ {% csrf_token %} を使用しているが、以前にビューでトークンを生成していなかったため、テンプレートがそれについて何も認識していないことです。

ドキュメントに従って、次の2 つのオプションがあります。

最初の解決策:

常に「django.core.context_processors.csrf」を使用する RequestContext を使用します (TEMPLATE_CONTEXT_PROCESSORS の設定に関係なく)。汎用ビューまたは contrib アプリを使用している場合、これらのアプリは全体で RequestContext を使用するため、既にカバーされています。

したがって、ビューのコードを次のように変更する必要があります。

def login(request):
    logout(request)
    username = password = ''
    if request.method :
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect('/main/')

    template = loader.get_template('index.html')
    context = RequestContext(request,{ 'username': username})
    return HttpResponse(template.render(context))

2番目の解決策:

プロセッサを手動でインポートして使用し、CSRF トークンを生成してテンプレート コンテキストに追加します。例えば:

そして、あなたのコードは(mcniacがあなたに言ったように)あるべきです:

def login(request):
    logout(request)
    username = password = ''
    if request.method :
        username = request.POST['username']
        password = request.POST['password']     
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect('/main/')
    context = { 'username': username}
    context.update(csrf(request))
    return render(request, 'index.html',)
于 2013-10-25T12:45:01.763 に答える