회원가입과 로그인 기능 추가하기-2

김의석 ·2024년 5월 3일
0

Django

목록 보기
25/39
post-thumbnail

링크 생성

<li>
  {% if not user.is_authenticated %}
  <a class="nav-link" href="{% url 'common:signup' %}">회원가입</a>
  {% endif %}
</li>
  • nav 태그에 추가

urls.py

app_name = "common"

urlpatterns = [
path("signup/", views.signup, name="signup"),
]
  • name=""의 이점
    • name 매개변수는 각 URL 패턴에 고유한 이름을 제공
    • reverse() 함수를 사용하여 URL을 동적으로 만들거나, 템플릿에서 {% url %} 태그를 사용하여 URL을 참조할 수 있다.
      *{% url 'common:signup' %}

forms.py

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


class UserForm(UserCreationForm):
    email = forms.EmailField(label="이메일")

    class Meta:
        model = User # User모델을 참조
        fields = (
            "username",
            "password1",
            "password2",
            "first_name",
            "last_name",
            "email",
        )
  • 계정생성시 사용할 UserForm
  • UserForm에 필드를 추가하기 위해django.contrib.auth.forms 모듈의 UserCreationForm을 상속하여 생성
  • class meta를 통해 "first_name", "last_name", "email"을 추가
  • UserCreationForm은 아래 속성을 가짐
    • username(ID)
    • password1
    • password2

views.py

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from common.forms import UserForm

def signup(request):
    if request.method == "POST":
        form = UserForm(request.POST)
        if form.is_valid(): 
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)  # 사용자 인증
            login(request, user)  # 로그인
            return redirect('index')
    else:
        form = UserForm()
    return render(request, 'common/signup.html', {'form': form})
  • if form.is_valid() : UserCreationForm의 속성 3개가 모두 입력되었는지, 비밀번호1과 비밀번호2가 같은지, 비밀번호의 값이 비밀번호 생성 규칙에 맞는지 등을 검사하는 로직을 내부적으로 가지고 있다!

  • form.cleaned_data.get : 회원가입시 작성한 form 입력값을 개별적으로 얻고싶은 경우 사용.

    • authenticate(username=username, password=raw_password) : 사용자 인증 담당(사용자명과 비밀번호 확인)
    • login(request, user) : 로그인 담당(사용자 세션 생성)
      • 신규 사용자 생성 후 자동 로그인 구현

signup.html

0504~ authenticate() 오류

회원가입 완료 후 가입 된 username으로 authenticate() 후 login() 실행하는 과정에서 가입 된 정보로 입력한 authenticate()가 none을 반환 함.

0506

  • 오류 확인

접근

  • 문제코드 확인

    • 해당 과정을 통해 회원가입 form으로 입력 받은 내용을 확인하고 문제가 되는 부분 확인
user = authenticate(
                user=username,
                password=raw_password1,
            )
           
            
  • 문제코드
    • 사용자 인증authenticate())에서 none을 반환
    • authenticate()가 기존에 있던 admin uiseok의 아이디와 비밀번호로도 인증하지 못함

  • settings.py authenticate() 관련 여러 설정들을 확인하였지만 특이사항 없었음.

츄라이츄라이

django 공식문서 authenticate() 관한 내용

0507

접근

  • 양육일지 개발준비로 일단은 다음과 같이 회원가입후 인증과 로그인을 거치지 않고 login으로 redirect 하게 하였다.

  • 추후 authenticate() 이슈 파악 후 기능 구현하는 것으로 정리

middleware.py 정리

  • authenticate 상태가 아니면 login으로 이동하게 함
    이때, authenticate 상태가 아닌 상태에서 signup으로 이동가능해야 함

  • 정리 완료

profile
널리 이롭게

0개의 댓글