2016-11-22 18 views
0

ので、コードは非常に簡単です:403ログイン後のページリフレッシュでCSRFエラー()Django?

views.py

@csrf_protect 
def index(request): 
    global userPersonalInformation 
    if request.method == "POST": 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      login(request, user) 
      profile = Profile.objects.get(username=username) 
      return render(request, 'main/profile.html', {"profile":profile}) 
     else: 
      if CheckUser(username, password): 
       user = User.objects.create_user(request.POST['username'], userPersonalInformation['email'], request.POST['password']) 
       user.save() 
       profile = Profile.objects.create(username=username,school=userPersonalInformation['school'],img=userPersonalInformation['img'], birthyear=userPersonalInformation['birthyear'],city=userPersonalInformation['city'],solved=progress['denominator']) 
       profile.save() 
       login(request, user) 
       return render(request, 'main/profile.html', {"profile": profile }) 
      else: 
       context = {"form": Userform(request.POST or None), } 
       return render(request, 'main/login.html', context) 
    else: 
     form = Userform() 
     context = {"form": form, } 
     return render(request, 'main/login.html', context) 

profile.html

{% block title %}Profile | {{ user.first_name }} 

そして、これは、プロフィール表示|ユーザー名はタイトルバーに正しく表示されます。つまり、ユーザーがログインしている。

Settings.py

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

urls.py /メイン

from django.conf.urls import url 
from . import views 

app_name = 'main' 

urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
] 

login.htmlと

{% extends "main/base.html" %} 
{% block title %}Sign in{% endblock %} 
{% block body %} 
<div class="container"> 
    <form method="post" action="" class="form-signin"> 
     <h2 class="form-signin-heading">Please sign in</h2> 
     {% csrf_token %} 
     {{ form.as_p }} 
     <button class="btn btn-primary" type="submit">Sign in</button> 
    </form> 
</div> 
{% endblock %} 

form.py

from django import forms 
from django.contrib.auth.models import User 


class Userform(forms.Form): 
    class Meta: 
     model= User 
     fields = ('username', 'password') 
    username = forms.CharField() 
    password = forms.CharField(widget=forms.PasswordInput()) 

チェックユーザー

CheckUser() 
    return True 

は、今の問題は、私はボタンで記号をクリックしたときに、私が表示されているすべての情報をプロフィールページの午前です。しかし、私がリフレッシュした瞬間に、私はこのエラーを受け取ります:

Forbidden (403) 
CSRF verification failed. Request aborted. 

私を助けてください。プロファイルは、データベースの中にuserの内容を持つ別のテーブルです。 userとprofileの両方のテーブルの主キーはユーザー名です。私がクロールしている別のウェブサイトの有効なユーザーである場合、CheckUser関数。彼がいる場合は、彼の詳細をデータベースに保存し、userPersonalInformationはグローバル辞書です。

Djangoのバージョン1.10

答えて

0

あなたはrenderあなたはログイン資格情報を処理し、同じビューでプロファイルテンプレートをINGのしているので、これが起こっています。

ログイン後にページを更新すると、ログインに送信したフォームデータが古いcsrftokenとともにサーバーに再送信され、CSRF Errorが発生します。

これをやめるには、ログインとプロファイルビューを分けてください。

ログイン情報を処理し、djangoのredirect関数を使用して、ログインが成功した場合、ユーザーをプロフィールビューにリダイレクトすることができます。

urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url(r'^profile/$', views.profile, name='profile'), 
] 
+0

を試してみてくださいしかし、どのように、私はこの 'profile'を渡します:あなたのURLで

login(request, user) return redirect('/profile/') 

次のようなリダイレクト機能を使用することができますリダイレクト機能? –

+0

プロファイルビューの 'url'または' url_name'だけをプロファイル関数に渡す必要があります。 – v1k45

+0

更新された回答を確認してください。 – v1k45

0

この

from django.views.decorators.csrf import ensure_csrf_cookie 

@ensure_csrf_cookie 
@csrf_protect 
def index(request): 
    global .... 
関連する問題