Django-cookies-handling
Django-Cookieの処理
Webアプリケーションの要件に応じて、サイト訪問者ごとにデータを保存したい場合があります。 Cookieはクライアント側に保存され、クライアントブラウザのセキュリティレベルによっては、Cookieの設定が有効な場合と無効な場合があります。
DjangoでのCookie処理を説明するために、前に作成したログインシステムを使用してシステムを作成しましょう。 システムはX分間ログインした状態を維持し、その時間を過ぎるとアプリを終了します。
このためには、last_connectionとusernameという2つのCookieを設定する必要があります。
まず、ログインビューを変更して、ユーザー名とlast_connection Cookieを保存します-
from django.template import RequestContext
def login(request):
username = "not logged in"
if request.method == "POST":
#Get the posted form
MyLoginForm = LoginForm(request.POST)
if MyLoginForm.is_valid():
username = MyLoginForm.cleaned_data['username']
else:
MyLoginForm = LoginForm()
response = render_to_response(request, 'loggedinl', {"username" : username},
context_instance = RequestContext(request))
response.set_cookie('last_connection', datetime.datetime.now())
response.set_cookie('username', datetime.datetime.now())
return response
上記のビューで見られるように、Cookieの設定は、要求ではなく応答で呼び出される set_cookie メソッドによって行われ、すべてのCookie値が文字列として返されることにも注意してください。
ログインフォーム用のformViewを作成しましょう。Cookieが設定されていて、10秒以上経過していない場合はフォームを表示しません-
def formView(request):
if 'username' in request.COOKIES and 'last_connection' in request.COOKIES:
username = request.COOKIES['username']
last_connection = request.COOKIES['last_connection']
last_connection_time = datetime.datetime.strptime(last_connection[:-7],
"%Y-%m-%d %H:%M:%S")
if (datetime.datetime.now() - last_connection_time).seconds < 10:
return render(request, 'loggedinl', {"username" : username})
else:
return render(request, 'loginl', {})
else:
return render(request, 'loginl', {})
上記のformViewで設定したCookieにアクセスするとわかるように、リクエストのCOOKIES属性(dict)を介して行われます。
次に、url.pyファイルを変更してURLを変更し、新しいビューとペアにします。
from django.conf.urls import patterns, url
from django.views.generic import TemplateView
urlpatterns = patterns('myapp.views',
url(r'^connection/','formView', name = 'loginform'),
url(r'^login/', 'login', name = 'login'))
/myapp/connectionにアクセスすると、次のページが表示されます-
そして、あなたは送信時に次の画面にリダイレクトされます-
ここで、10秒の範囲で/myapp/connectionに再度アクセスしようとすると、2番目の画面に直接リダイレクトされます。 また、この範囲外で/myapp/connectionに再度アクセスすると、ログインフォームが表示されます(画面1)。