[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 19 회차 미션

2020. 11. 20. 23:21Coding/Python-Fastcampus

728x90

03. View - 03. 로그인 만들기

회원가입과 마찬가지로 FormView를 이용해서 간단하게 구현한다.

1. views.py 에서 LoginView를 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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)
cs

form_valid 함수는 로그인 이후에 세션에 email을 저장하는 부분인데, 그냥 외워야하는 부분인거같다.

 

2. login.html을 만든다.

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
{% extends "base.html" %}
 
{% block contents %}
 
    <div class="row mt-5">
        <div class="col-12 text-center">
            <h1>로그인</h1>
        </div>
    </div>
    <div class="row mt-5">
        <div class="col-12">
            {{ error }}
        </div>
    </div>
 
    <div class="row mt-5">
        <div class="col-12">
            <form method="POST" action=".">
                {% csrf_token %}
                {% for field in form %}
                <div class='form-group'>
                    <label for="{{field.id_for_label}}">{{ field.label }}</label>
                    <input type="{{ field.field.widget.input_type }}" class="form-control" id="{{ field.id }}" placeholder="{{ field.label }}" name="{{ field.name }}" />
                </div>
                {% if field.errors %}
                <span style="color: red;">{{ field.errors }}</span>
                {% endif%}
                {% endfor %}
                <button type="submit" class="btn btn-primary">로그인</button>
            </form> 
        </div>
    </div>
{% endblock %}
 
cs

이전에 만든 회원가입 부분을 복사해서 만들면된다.

어차피 기본틀이고, for문으로 forms.py의 내용을 출력하는거라 문제없다.

 

3. forms.py 로그인 폼을 만든다. 이전에 만든 RegisterForm은 생략했다.

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
from django.contrib.auth.hashers import check_password, make_password
 
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) :
        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''ID가 없습니다.')
                return
 
            if not check_password(password, fcuser.password) :
                self.add_error('password''비밀번호를 틀렸습니다.')
            else :
                self.email = fcuser.email
cs

이전에 만든 login을 참고하였다.

Fcuser.objects.get(email)을 통해서 해당 유저가 있는지를 확인하고,

check_password()를 통해서 비밀번호를 확인하여 로그인을 승인한다.

 

 

4. urls.py에 등록

1
2
3
4
5
6
7
8
9
10
11
from django.contrib import admin
from django.urls import path
from fcuser.views import index, RegisterView, LoginView
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),
    path('register/', RegisterView.as_view()),
    path('login/', LoginView.as_view()),
]
 
cs

RegisterView.as_view()처럼 class를 등록할때는 .as_view()를 넣어준다.

 

 

5. index.html 수정.

1
2
3
4
5
6
7
{% extends "base.html" %}
 
{% block contents %}
Hello!
{{ email }}
{% endblock %}
 
cs

별건 없고, 단순히, 로그인 이후에 {{ email }}을 통해서 sessioin에 email이 잘 등록되었는지 확인용.

 

6. views.py에서 index.html로 email 보내는 부분 작성.

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

session에서 user값(email이 담겨있다.)을 가져와서 email에 넣어 index.html로 보낸다.

 

 

7. 결과

 

 

 

 


06. 함수 - 01. 함수 및 람다(lambda)(1)

다중리턴.

1
2
3
4
5
6
7
8
9
10
def fun_mul(x) :
    w = x * 100
    y = x * 200
    z = x * 300
 
    return w,y,z
 
a,b,c = fun_mul(100)
 
print(a,b,c)
cs

 

다중리턴(다중 타입).

1
2
3
4
5
6
7
8
9
10
def fun_mul(x) :
    w = x * 100
    y = "qwer"
    z = x * 2.0
 
    return w,y,z
 
a,b,c = fun_mul(100)
 
print(a,b,c)
cs

 

다중 리턴은  신박해서 정리.

다중 타입으로 다중 리턴도 잘 됨.

 

 

 


06. 함수 - 02. 함수 및 람다(lambda)(2)

가변인자.

1
2
3
4
5
6
def args_func(*args) :
    print(args)
 
args_func('kim')
args_func('kim'"lee")
args_func('kim'"lee""park")
cs

Tuple로 넘어온다.

for문으로 활용가능.

 

*로 표시한다.    *args

java에서는 ...    String... strs

kotlin에서는 vararg로 표현하는게 있다.    vararg numbers:Int

 

 


**kwargs

1
2
3
4
5
6
def kwargs_func(**kwargs) :
    print(kwargs)
 
kwargs_func(val1='abc', val2='ㄱㄴㄷ')
kwargs_func(val1='abc', val2='ㄱㄴㄷ', val3=123)
kwargs_func(val1='abc', val2='ㄱㄴㄷ', val3=123, val4=3.14)
cs

Dict으로 반환.

갯수 제한없음

 

for문으로 활용가능.

1
2
3
4
5
6
7
def kwargs_func(**kwargs) :
    for k,v in kwargs.items() :
        print(k,v)
 
kwargs_func(val1='abc', val2='ㄱㄴㄷ')
kwargs_func(val1='abc', val2='ㄱㄴㄷ', val3=123)
kwargs_func(val1='abc', val2='ㄱㄴㄷ', val3=123, val4=3.14)
cs

 

 

올인원 패키지 : 파이썬 웹 개발👉https://bit.ly/33a7nvc

728x90