회원으로 인증 받기(로그인) 위해서 필요한 절차는?


보통 로그인은 내가 입력한 username, password 값을 회원가입 때 저장된 username, password 값과 대조하는 시스템이다. 



로그인 폼을 만들어 username과 password를 입력하고,


view에서 전달 받은 username과 password를 갖고 데이터베이스에 저장된 데이터와 대조하여 인증 절차를 거친다.

(인증 기능을 갖고 있는 authenticate 함수를 활용한다)


그 결과 회원 인증 완료시 원하는 페이지를 출력한다.



1) 로그인 폼을 만들어 username과 password 입력칸을 만든다


1
2
3
4
5
6
7
8
9
10
11
{% block body %}
<div class="container">
  <form method="post" action="" class="form-signin">
    {% csrf_token %}
    <h2 class="form-signin-heading">Please log in</h2>
    <input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus="">
    <input type="password" name="password" class="form-control" placeholder="Password" required="">
    <button class="btn btn-lg btn-primary btn-block" type="submit">Log in</button>
  </form>
</div>
{% endblock %}
cs



view에서 인증처리하는 방식에 대한 설명은 아래와 같다.

(https://docs.djangoproject.com/en/1.10/topics/auth/default/#how-to-log-a-user-in)



1
2
3
4
5
6
7
8
9
10
11
from django.contrib.auth import authenticate, login
 
def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        login(request, user)
        # Redirect to a success page.
    else:
        # Return an 'invalid login' error message.
cs



로그인 폼에서 입력 받은 username과 password 값을 authenticate 함수를 통해 인증 절차를 거치고,

if문을 작성하여 확인 여부에 따라 로그인 처리를 하는 login 함수를 사용한다.

로그인에 성공하면 원하는 페이지로 redirect 시킬 수 있게 url을 입력한다.



2) authenticate 함수와 login 함수를 적용한다


1
2
3
4
5
6
7
8
9
10
11
12
13
def login(request):
    if request.method == "GET":
        pass
    elif request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        user = authenticate(username=username, password=password)
        if user is not None:
            auth_login(request, user)
        else:
            pass
 
        return redirect("/partner/")
cs



login에서 auth_login으로 바뀐 까닭은?

이미 view의 이름으로 login이 존재하므로 중복사용을 피하고자 다른 명칭으로 login 함수를 사용해야한다.

안그러면 오류가 발생하는데 이유는 최초에 쓰인 login 함수가 2개의 인자를 받지 않고 request 한 개만 받고 있기 때문이다.


이를 위해 함수를 import할 때 전치사 "as"를 사용하여 auth_login으로 사용함을 명시해주어야한다.


1
from django.contrib.auth import authenticate, login as auth_login
cs


그럼 중복을 피하면서 똑같은 기능을 유지할 수 있다. 


이번에는 로그인에 실패한 경우 실패메시지를 보내도록 설정해보자.


로그인 폼에서 입력 받은 정보가 똑같이 데이터베이스로 전달되지만,


User 모델에 저장된 회원 정보와 다를 경우 login 처리를 시키지 않고,


로그인 폼 아래에 "존재하지 않는 사용자"라는 텍스트만 전달할 뿐 어떠한 변화를 주지 않는다.

   


1
2
        else:
            ctx.update({ "error" : "존재하지 않는 사용자입니다." })
cs


비어있는 ctx 변수의 값을 변경하는 방식으로 메시지 전달 방식을 택했다.


1
2
3
4
5
6
7
8
9
10
<div class="container">
  <form method="post" action="" class="form-signin">
    {% csrf_token %}
    <h2 class="form-signin-heading">Please log in</h2>
    <input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus="">
    <input type="password" name="password" class="form-control" placeholder="Password" required="">
    {{ error }}
    <button class="btn btn-lg btn-primary btn-block" type="submit">Log in</button>
  </form>
</div>
cs



로그아웃 하기


로그아웃은 로그인시 사용된 우리의 정보가 떨어져 나가게 하는 시스템이다.

따라서 로그인과 다른 점은, 데이터 입력이 필요 없다. logout 함수만 사용하면 로그아웃 완료된다.



1
2
3
def logout(request):
    auth_logout(request)
    return redirect("/partner/")
cs


단, 로그아웃 버튼에 대한 url 주소를 추가할 필요가 있다. 그래야 logout 함수가 활성화된다.


1
2
3
4
5
6
7
8
9
from django.conf.urls import url
from .views import index, signup, login, logout
 
urlpatterns = [
    url(r'^$', index, name='index'),
    url(r'^signup/$', signup, name='signup'),
    url(r'^login/$', login, name='login'),
    url(r'^logout/$', logout, name='logout'),
]
cs


블로그 이미지

쵸잇

,

장고의 장점 중에 하나인 내장된 User 모델을 활용하여 유저 관리를 쉽게 할 수 있다.


장고 authentication system에서 User 모델에 대한 설명이 있다.

https://docs.djangoproject.com/en/1.10/topics/auth/default/


위 자료를 통해 User 모델의 속성을 파악할 수 있고,

실제로 어떤 코드로 User 모델이 짜여져 있는지 확인하려면 아래 깃허브를 따라서 살펴볼 수 있다.
https://github.com/django/django/blob/master/django/contrib/auth/models.py



User 모델의 사용 목적은 회원가입을 받아서 회원들의 데이터를 저장하고자하는 것이다.

회원가입 폼을 만들어 "username" "email" "password"를 입력 받는다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
{% extends "base.html" %}
{% block title %}my_project{% endblock %}
{% block body %}
<div class="container">
  <form method="post" action="" class="form-signin">
    {% csrf_token %}
    <h2 class="form-signin-heading">Please sign in</h2>
    <input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus="">
    <input type="email" name="email" class="form-control" placeholder="Email address" required="">
    <input type="password" name="password" class="form-control" placeholder="Password" required="">
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
  </form>
</div>
{% endblock %}
cs


1
<input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus="">
cs


(*autofocus는 해당 웹페이지를 처음 열었을 때, 입력 폼에서 "username"을 입력하는 칸에 커서가 깜빡이도록 설정)


앞서 말했듯 장고에서 별도로 User 모델을 갖추고 있으므로 models.py에서 우리가 관여할 것은 전혀 없다.

User 모델이 저장된 곳에서 view로 잘 불러오기만 하면 된다. (from django.contrib.auth.models import User)

그리고 폼에서 입력 받은 데이터를 view에서 처리하여 하나의 user 객체로 만들어 User 모델에 저장된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.shortcuts import render
from django.contrib.auth.models import User
 
# Create your views here.
def index(request):
    ctx = {}
    return render(request, "index.html", ctx)
 
def signup(request):
    if request.method == "GET":
        pass
    elif request.method == "POST":
        username = request.POST.get("username")
        email = request.POST.get("email")
        password = request.POST.get("password")
 
        user = User.objects.create_user(username, email, password)
 
    ctx = {}
    return render(request, "signup.html", ctx)
cs



user 인스터스가 만들어질 때 기존의 방식과 다른 점이 있다.


하나는 user 변수에 데이터를 입력 받은 객체를 담는다는 것이다.


두번째는 User.objects.create가 아닌 User.objects.create_user로 작성하는 것이다.


이 차이에 발생하는 장점은 폼에서 password를 입력한 그대로 저장되어 관리자에게 보여지지 않고,

특수 암호화되어 관리자도 볼 수 없게 처리하기 때문에 보안측면에서 도움이 된다.

블로그 이미지

쵸잇

,

실수로 표시된 재고율 데이터의 가독성을 높이고자 백분율로 표시 형식을 바꿀 것이다.

만약 음수나 숫자 0이 있다면 "*" 표시할 것이다.



영업소별 라도스 재고현황
단가 :         24,500
영업소코드 영업소명 입고량 판매량 재고량 판매금액 재고율
SE-001 서울 500 450 50 11025000 0.1
BU-002 부산 350 320 30 7840000 0.08571429
DA-003 대구 300 280 20 6860000 0.06666667
GW-004 광주 300 300 0 7350000 0
TA-005 대전 250 230 20 5635000 0.08
SE-001 서울 250 220 30 5390000 0.12
BU-002 부산 250 200 50 4900000 0.2
DA-003 대구 200 175 25 4287500 0.125
GW-004 광주 200 170 30 4165000 0.15
TA-005 대전 150 135 15 3307500 0.1
SE-001 서울 150 140 10 3430000 0.06666667



재고율

0.1


0.08571429
0.06666667
0
0.08
0.12
0.2
0.125
0.15

0.1

0.06666667




셀서식 - 표시형식 - 사용자 지정 탭으로 들어가서


빈칸에 우리가 원하는 바를 입력한다.


1) 백분율을 나타내려면 0.0% 입력

2) 음수를 "*"하려면 "*" 입력

3) 숫자 0을 "*"하려면 "*" 입력


3가지를 묶어서 표현하려면 ";"를 입력해서 이어주면 된다.


0.0%;"*";"*"


주의할 점은 입력하는데 순서가 존재하므로 이 규칙을 따라 형식을 작성한다.

양수, 음수, 숫자 0, 텍스트 순으로 활성화가 된다.


따라서 실수로 된 양수는 백분율로 표시, 음수와 숫자 0은 "*"로 표시한다는 말이다. 



서식이 반영된 재고율


재고율

10.0%


8.6%


6.7%

*

8.0%

12.0%

20.0%

12.5%

15.0%

10.0%

6.7%


'오피스 > 엑셀' 카테고리의 다른 글

엑셀 단축키 학습  (0) 2018.12.03
고급필터 학습  (0) 2018.12.03
조건부서식용 함수 학습  (0) 2018.11.29
블로그 이미지

쵸잇

,