The Boxer

[Django] 계정 생성, 로그인, 로그아웃 본문

Django

[Django] 계정 생성, 로그인, 로그아웃

Prower 2019. 4. 12. 10:26
728x90
반응형

I. 계정 생성

django는 생성 당시부터 User라는 객체를 관리한다.

User객체에는 계정에 필요한 id, pw등의 속성이 담겨있고, django가 이를 관리하고 있다.

django는 이를 활용해서 계정생성, 로그인, 계정정보 변경 등의 form을 제공하고, 이를 활용하여 각 기능을 구현한다.

 

(1) UserCreationForm

- django가 생성해주는 User 생성용 form

- view단에서 form을 생성하고, template단으로 넘겨주어서 form 태그 안에서 사용할 수 있다.

- form객체 생성시 입력값으로 자료를 넘겨 User객체로 저장가능한 form객체를 생성할 수 있다.

- form태그 생성, User객체 생성을 담당

 

(2) 계정 생성 과정

  1. 사용자에게 계정생성 form 제공
  2. 사용자가 입력한 정보를 기반으로 User를 생성하는 form객체 생성
  3. form객체의 유효성을 검사한 뒤 User 생성

 

사용 방법

django.contrib.auth.forms

에서 UserCreationForm을 import하여 사용

구현 예시(view)

def signup(request):
	# request가 POST일 경우 회원가입
    if request.method == "POST":
    	# request를 통해 넘어온 값을 입력값으로 주어 User객체를 생성하는 form객체 생성
        form = CustomUserCreationForm(request.POST)
        
        if form.is_valid():
            user = form.save()
            Profile.objects.create(user=user)
            return redirect(...)
            
    # GET일 경우 계정 생성 form을 생성하여 return
    else:
        form = CustomUserCreationForm()
        return render(request, 'signup.html', {'form': form})

구현 예시(template)

<form method="POST">
  {% csrf_token %}
  {% bootstrap_form form %}
  <button type="submit" class="btn btn-primary">login</button>
</form>

 

(3) 유저 추가시 발생할 수 있는 오류

You are trying to add a non-nullable field 'user' to post without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 
1) Provide a one-off default now (will be set on all existing rows with a null value for this column) 
2) Quit, and let me add a default in models.py 
Select an option: 1 
Please enter the default value now, as valid Python The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now 
Type 'exit' to exit this prompt 
>>> 1

- 이미 있는 자료(article, post 등)에 user 속성을 추가하고, makemigration실행시 발생

- user속성은 NOT NULL constraint를 갖고 있으며 이미 있는 자료들은 user 정보를 갖고 있지 않기 때문에 django가 에러를 발생

- 기존에 있는 정보(1: admin user)를 삽입하거나, 수정을 하지 않는 방향 선택

 

 

II. 로그인

django가 관리하는 User객체와 django가 생성하는 로그인용 form을 사용하여 구현

(1) User

- django가 관리하는 User객체 모임

- django.contrib.auth에 저장된 사용자들의 객체

- html 문서에서 {{ user }}를 사용하여 접근 가능

- request객체 안에는 로그인된(인증된) user객체가 담겨 있으며 request.user로 접근 가능

 

접근 방법

  • django.contrib.auth에 저장된 User객체에 직접 접근 가능
  • 그러나 django에서 이러한 객체에 직접 접근하는 방법은 지양
  • django.conf의 settings에 저장된 AUTH_USER_MODEL을 통해 접근

 

(2) 로그인 과정

  1. 유저가 유효한지 검증
  2. 서버에게 해당 유저가 유효하다는 것을 알려준다
  3. 유효한 유저를 세션에 저장

 

HTTP의 특성

- Stateless: 무 상태성

  • 한번 검증을 거쳐도 다시 검증을 해야함
  • 상태가 저장되지 않는 프로토콜
  • 검증이 된 사용자에게 cookie를 제공하여 인증된 유저임을 확인
  • 세션: 로그인된 유저의 정보와 상태를 서버에서 관리

 

(3) 유저 검증 방법

1. Authenticate 함수 사용

- django가 제공하는 User인증 함수

- 사용자가 입력한 username과 password를 검증한 뒤 유효한 사용자로 판단

  • 유효한 사용자일 경우 해당되는 user객체를 반환
  • 검증이 되지 않는 경우 None 반환

- 세션정보을 위해 request객체를 넘겨주어야 함

구현 예시

def signup(request):
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        # User 검증
        login_user = authenticate(request, username=username, password=password)

 

2. AuthenticationForm 사용

- django가 제공하는 User인증 및 ModelForm 생성함수

- form객체를 생성하여 template단에서 form 태그를 생성

- request로 넘어온 사용자가 입력한 정보를 기반으로 User를 검증

- 세션정보을 위해 request객체를 넘겨주어야 함

구현 예시

def signup(request):
    if request.method == "POST":
		# form객체를 기반으로 유저 인증
        form = AuthenticationForm(request, request.POST)
        
        if form.is_valid():
            ...
    else:
    	# request가 GET일 경우 form 생성
        form = AuthenticationForm()
        return render(request, 'accounts/login.html', {'form': form})

 

(4) login

- django가 제공하는 로그인 함수

- 세션정보를 위해 request객체어떤 User를 로그인 시킬지 정하기 위해 User객체를 인자로 넘겨주어야 함

구현 예시

def signup(request):
    if request.method == "POST":
        # User 검증
        form = AuthenticationForm(request, request.POST)
        
        if form.is_valid():
            login(request, form.get_user())

 

(5) logout

- django가 제공하는 logout 함수

- 사용자를 세션에서 제외

세션정보를 위해 request객체를 넘겨주고, 현재 로그인해 있는 유저를 logout

구현 예시

def logout(request):
    auth_logout(request)

 

 

 

 

 

 

728x90
반응형

'Django' 카테고리의 다른 글

[Django] 계정정보 수정, 비밀번호 변경  (0) 2019.04.18
[Django] M : N Relation 구현  (0) 2019.04.12
[Django] Image Upload  (0) 2019.04.11
[Django] Model Form  (0) 2019.04.10
Comments