Django CBV 프로젝트 3. 사용자 인증 (로그인) 참고 사이트
Views.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 from django.contrib.auth import get_user_modelfrom django.contrib.auth.views import LoginViewfrom user.models import User from user.forms import UserRegistrationForm, LoginForm from django.contrib import messages class UserLoginView (LoginView ): template_name = 'user/login_form.html' authentication_form = LoginForm def form_invalid (self, form ): messages.error(self.request, '로그인에 실패하였습니다.' , extra_tags='danger' ) return super ().form_invalid(form)
urls.py 1 2 3 urlpatterns = [ path('user/login/' , UserLoginView.as_view()), ]
1 2 3 4 5 6 7 8 9 10 11 from django.contrib.auth.forms import UserCreationForm, AuthenticationFormfrom django.forms import EmailFieldclass LoginForm (AuthenticationForm ): username = EmailField(widget=forms.EmailInput(attrs={'autofocus' : True }))
settings.py 1 2 LOGIN_URL = '/user/login/' LOGIN_REDIRECT_URL = '/article/'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 {% extends 'base.html' %} {% block title %}<title > 로그인</title > {% endblock %} {% block css %} <link rel ="stylesheet" href ="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" > <style > .registration { width : 360px ; margin : 0 auto; } p { text-align : center; } label { width : 50% ; text-align : left; } .control-label { width : 100% ; } .registration .form-actions > button { width : 100% ; } </style > {% endblock css %} {% block content %} <div class ="panel panel-default registration" > <div class ="panel-heading" > 로그인하기 </div > <div class ="panel-body" > <form action ="." method ="post" > {% csrf_token %} {% for field in form %} <div class ="form-group {% if field.errors|length > 0 %}has-error{%endif %}" > <label for ="{{ field.id_for_label }}" > {{ field.label }}</label > <input name ="{{ field.html_name }}" id ="{{ field.id_for_lable }}" class ="form-control" type ="{{ field.field.widget.input_type }}" value ="{{ field.value|default_if_none:'' }}" > {% for error in field.errors %} <label class ="control-label" for ="{{ field.id_for_label }}" > {{ error }}</label > {% endfor %} </div > {% endfor %} <div class ="form-actions" > <button class ="btn btn-primary btn-large" type ="submit" > 로그인하기</button > </div > </form > </div > </div > {% endblock content %}
(중요) Session ?? 로그인한 사용자에게만 발급하는 일종의 표딱지 사용권
장고의 세션
->
세션 미들웨어 : 여러가지 세션 백엔드 중 하나를 선택해서 백엔드에게 실제 저장기능을 위임
세션 백엔드 모듈이름
기능
django.contrib.sessions.backends.db
데이터베이스에 저장하는백엔드
django.contrib.sessions.backends.cache
캐시에 저장하는 백엔드
django.contrib.sessions.backends.cache_db
캐시와 데이터베이스를 병행하는 백엔드
django.contrib.sessions.backends.file
파일에 저장하는 백엔드
django.contrib.sessions.backends.signed_cookie
쿠키에 저장하는 백엔드
사용자가 요청을 할 때마다 쿠키의 sessionid
를 확인 후 세션 백엔드 세션데이터를 불러와 request.session
객체에 저장 ,만일 세션데이터가 유효하지 않다면(expire_date, path 등) 빈 세션데이터만 저장
cf) 세션데이터는 사용자가 매 요청마다 불러와야 하는 값이고 응답할 때까지 메모리에 저장하고 있어야 하기 때문에 너무 많은 데이터를 가지고 있으면 서버의 가용성에 지장이 생길 수 있습니다. 대부분의 사용자가 매번 필요한 데이터일 경우에만 세션객체에 추가하셔야 합니다.