django 04. 장고 개인 프로젝트 2 - 인증 (회원가입, 로그인)

|

django 04. 장고 개인 프로젝트 (메모 앱) - 인증 (회원가입, 로그인)

개인 프로젝트에 인증 기능을 추가하는 과정을 기록하였습니다.

결과물


회원가입

ModelForm 작성

  • 회원가입시 데이터를 입력 받을 폼을 작성한다.
  • ModelForm 은 자동적으로 당신이 제공한 model 소속의 폼을 작성한다. 그리고 필드에 기초해서 입력값을 확인한다.
  • forms.py
from django import forms from django.contrib.auth.models import User class UserForm(forms.ModelForm): class Meta: model = User fields = ['username', 'email', 'password'] 

url 패턴추가

  • urls.py
urlpatterns = [ url(r'^join/$', views.signup, name='join'), ] 

view 작성

  • views.py 에 signup 메소드 추가
  • POST request 인 경우, UserForm으로 받은 POST 값을 가지고 신규 유저를 등록
  • 일반 접속인 경우, UserForm 을 반환
  • views.py
from django.shortcuts import render, redirect from .forms import UserForm from django.contrib.auth.models import User from django.contrib.auth import login def signup(request): if request.method == "POST": form = UserForm(request.POST) if form.is_valid(): new_user = User.objects.create_user(**form.cleaned_data) login(request, new_user) return redirect('index') else: form = UserForm() return render(request, 'memo_app/adduser.html', {'form': form}) 

template 작성

 <h2>회원가입</h2> <form method="post" action=""> {% csrf_token %} {{ form.as_p }} <input type="submit" value="회원가입" /> </form> 
views
adduser.html 탬플릿 구현화면

로그인 구현 첫번째 방법 - ModelForm 사용

ModelForm 작성

  • 로그인시 데이터를 입력 받을 폼을 작성한다.
  • ModelForm 은 자동적으로 당신이 제공한 model 소속의 폼을 작성한다. 그리고 필드에 기초해서 입력값을 확인한다.
  • forms.py
from django import forms from django.contrib.auth.models import User class LoginForm(forms.ModelForm): class Meta: model = User fields = ['username', 'password'] # 로그인 시에는 유저이름과 비밀번호만 입력 받는다. 

url 패턴추가

  • urls.py
urlpatterns = [ url(r'^login/$', views.signin, name='login'), ] 

view 작성

  • views.py 에 signin 메소드 추가 (메소드 명이 함수명 ex. login() 등과 겹치지 않도록 주의)
  • POST request 인 경우, LoginForm으로 받은 POST 값을 가지고 인증 및 로그인
  • 일반 접속인 경우, LoginForm을 반환
  • views.py
from django.shortcuts import render, redirect from django.http import HttpResponse from .forms import UserForm, LoginForm from django.contrib.auth.models import User from django.contrib.auth import login, authenticate from django.template import RequestContext def signin(request): if request.method == "POST": form = LoginForm(request.POST) username = request.POST['username'] password = request.POST['password'] user = authenticate(username = username, password = password) if user is not None: login(request, user) return redirect('index') else: return HttpResponse('로그인 실패. 다시 시도 해보세요.') else: form = LoginForm() return render(request, 'memo_app/login.html', {'form': form}) 

template 작성

  • login.html
 <h2>로그인</h2> <form method="post" action=""> {% csrf_token %} {{ form.as_p }} <input type="submit" value="로그인" /> </form> 
views
login.html 탬플릿 구현화면

로그인 후 username을 탬플릿에서 표시

##

{% if user.is_authenticated %} <p>Welcome, {{ user.username }}. Thanks for logging in.</p> {% else %} <p>Welcome, new user. Please log in.</p> {% endif %}

 ----- # 로그인 구현 두번째 방법 - Authentication Views 사용 > 장고는 login, logout, password management 를 위한 몇가지 views를 제공하고 있다. ## Authentication Views 도입 - url include - urls.py ```python urlpatterns = [ url('^', include('django.contrib.auth.urls')), ] 
  • 위의 include를 통해서 아래의 url 패턴을 사용할 수 있다.
 ^login/$ [name='login'] ^logout/$ [name='logout'] ^password_change/$ [name='password_change'] ^password_change/done/$ [name='password_change_done'] ^password_reset/$ [name='password_reset'] ^password_reset/done/$ [name='password_reset_done'] ^reset/done/$ [name='password_reset_complete'] 

상기의 url이 본인이 작성한 view를 사용하게 하는 방법

  • auth_views 사용
from django.contrib.auth import views as auth_views urlpatterns = [ url('^change-password/$', auth_views.password_change), ] 
  • auth_views는 view의 상태를 변경할 수 있는 옵션 인자를 받는다. 예를 들어, 만약 template name을 변경하고 싶은 경우 인자 template name을 제공할 수 있다.
  • 그밖에 제공 가능한 인자는 가이드문서 에서 확인
urlpatterns = [ url(r'^logout/$', auth_views.logout, {'next_page' : '/'}), #로그아웃 후 홈으로 이동 url(r'^login/$', auth_views.login), url('^', include('django.contrib.auth.urls')), ] 

로그인 후 홈으로 이동하도록 하는 방법

  • django.contrib.auth.views.login은 로그인이 성공하면 settings.LOGIN_REDIRECT_URL (which defaults to /accounts/profile/) 으로 리다이렉트 하도록 설정되어 있다.
  • 변경을 위해서는 settings.py 에 LOGIN_REDIRECT_URL 항목 추가가 필요하다.

  • settings.py
# 로그인 이후 경로 수정 LOGIN_REDIRECT_URL = "/" 

글쓰기 PostForm 과 로그인한 usrname을 연결하는 방법 1

  • 글 작성후 POST로 데이터 전송시, 해당 모델 클래스의 name 컬럼에 현재 usrname 을 저장한다.
  • memo.name = request.user.get_username()
  • views.py
def post(request): if request.method == "POST": #저장 form = PostForm(request.POST) if form.is_valid(): memo = form.save(commit = False) memo.name = request.user.get_username() memo.generate() return redirect('index') else: #입력 form = PostForm() return render(request, 'memo_app/form.html',{'form': form}) 

글쓰기 PostForm 과 로그인한 usrname을 연결하는 방법 2 - ForeignKey 사용

  • models.py 수정
  • Memos 모델 클래스의 컬럼 name_id 를 User 모델 클래스와 연결한다. ```python from django.db import models from django.utils import timezone from django.contrib.auth.models import User

Create your models here.

class Memos(models.Model): name_id = models.ForeignKey(User, on_delete = models.CASCADE)

def __str__(self): return '%s by %s' % (self.title, self.name_id) ``` 
  • views.py 수정
  • memo.name_id = User.objects.get(username = request.user.get_username()) 를 통해서 현재 로그인된 username을 갖는 User의 오브젝트를 name_id 컬럼에 할당한다.
    def post(request): if request.method == "POST": #저장 form = PostForm(request.POST) if form.is_valid(): memo = form.save(commit = False) memo.name_id = User.objects.get(username = request.user.get_username()) memo.generate() return redirect('index')