210413

팔리동·2021년 4월 13일
0

TIL

운영체제

파이썬 심화

# 에러 방지 
Student.detail_info(studt1)
Student.detail_info(studt2)

# 비교 
print(studt1.__class__, studt2.__class__)
print(id(studt1.__class__) == id(studt2.__class__))

print()

# 인스턴스 변수 
# 직접 접근(PEP 문법적으로 권장x)

# studt1._name = 'HAHAHA'
print(studt1._name, studt2._name)
print(studt1._email, studt2._email)

print()
print()

# 클래스 변수 

# 접근 
print(studt1.student_count)
print(studt2.student_count)
print(Student.student_count)

print()
print()

# 공유 확인 
print(Student.__dict__)
print()
print(studt1.__dict__)

# 인스턴스 네임스페이스 없으면 상위에서 검색 
# 즉, 동일한 이름으로 변수 생성 가능(인스턴스 검색 후 -> 상위(클래스 변수, 부모 클래스 변수))

del studt2
print(studt1.student_count)
print(Student.student_count)
  • 실행결과는 파일에서 확인하자

장고로 쇼핑몰 만들기(로그인,회원가입구현)

forms.py

class RegisterForm(forms.Form):
    email = forms.EmailField(
        error_messages={
            'required' : '이메일을 입력해주세요.'
        },
        max_length=64, label='이메일'
    )
    password = forms.CharField(
        error_messages={
            'required' : '비밀번호를 입력해주세요.'
        },
        widget=forms.PasswordInput, label='비밀번호'
    )
    re_password = forms.CharField(
        error_messages={
            'required' : '비밀번호를 입력해주세요.'
        },
        widget=forms.PasswordInput, label='비밀번호 확인'
    )

    def clean(self):
        # super()는 메소드 오버라이딩 
        cleaned_data = super().clean()  # 값이 들어있는지 검사한다. 들어잇으면 아래 변수를 할당, 없으면 실패하고 튕군다. 
        email = cleaned_data.get('email')
        password = cleaned_data.get('password')
        re_password = cleaned_data.get('re_password')

        if password and re_password:
            if password != re_password:
                self.add_error('password', '비밀번호가 서로 다릅니다.')
                self.add_error('re_password', '비밀번호가 서로 다릅니다.')
            else:
                fcuser = Fcuser(
                    email=email,
                    password=make_password(password) 
                )
                fcuser.save()

class LoginForm(forms.Form):
    email = forms.EmailField(
        error_messages={
            'required' : '이메일을 입력해주세요.'
        },
        max_length=64, label='이메일'
    )
    password = forms.CharField(
        error_messages={
            'required' : '비밀번호를 입력해주세요.'
        },
        widget=forms.PasswordInput, label='비밀번호'
    )
    
    def clean(self):
        # super()는 메소드 오버라이딩 
        cleaned_data = super().clean()  # 값이 들어있는지 검사한다. 들어잇으면 아래 변수를 할당, 없으면 실패하고 튕군다. 
        email = cleaned_data.get('email')
        password = cleaned_data.get('password')

        if email and password:
            try:
                fcuser = Fcuser.objects.get(email=email)
            except Fcuser.DoesNotExist:
                self.add_error('email', '아이디가 없습니다.')
                return
            if not check_password(password, fcuser.password):
                self.add_error('password', '비밀번호를 틀렸습니다.')
            else:
                self.email = fcuser.email
             
  • forms.py를 만들어서 로그인과 회원가입 폼에서 데이터를 처리하는 로직을 짰다.

views.py

from django.shortcuts import render
from django.views.generic.edit import FormView 
from .forms import RegisterForm, LoginForm

# Create your views here.

def index(request):
    return render(request, 'index.html', {'email': request.session.get('user')})

class RegisterView(FormView):
    template_name = 'register.html'
    form_class = RegisterForm
    success_url = '/'  

class LoginView(FormView):
    template_name = 'login.html'
    form_class = LoginForm
    success_url = '/'  

    def form_valid(self, form):
        self.request.session['user'] = form.email

        return super().form_valid(form)
  • 기존에 로그인 회원가입은 view파트에서 구현을 많이했는데 이번에는 제네릭뷰인FormView 상속 받아서 만들어서 view코드가 깔끔하다.

  • def form_valid(self, form): 이 함수에서
    return super().form_valid(form)이 부분을 이해하느라 애먹었다. super()는 부모클래스에서 가져오는 것이다.

  • 유효한 폼데이터가 POST 요청되었을 때 form_valid 메소드가 호출된다. form_valid는 단순히 success_url로의 연결을 수행한다.

  • self.request.session['user'] = form.email는 세션에 key:'user'값을 form.email(로그인한 계정의 이메일)로 지정한다.

정리

  • 아직까지 장고가 어떻게 이루어졌는지(상속받는 클래스가 어떻게 이루어졌는지) 잘 모르겠다. 로그인 로그아웃을 구현하는 방법도 너무 많고 어떨 때 어떤 걸 써야하는지 잘 모르겠다.

  • 반복하면서 계속 익혀봐야겠다. 또 상속하는 클래스도 뜯어보고 파이썬 심화도 집중해서 들어야겠다.

profile
배움의 기록

0개의 댓글