바뀜

둘러보기로 가기 검색하러 가기
1,157 바이트 추가됨 ,  2022년 12월 14일 (수) 09:39
7번째 줄: 7번째 줄:  
필요한 기능에 대해 생각하고 url을 짠다.<syntaxhighlight lang="python">
 
필요한 기능에 대해 생각하고 url을 짠다.<syntaxhighlight lang="python">
 
from django.urls import path
 
from django.urls import path
from django.contrib.auth import views as auth_views#장고에서 제공하는 기능 활용!
+
from django.contrib.auth import views as auth_views #장고에서 제공하는 기능 활용!
    
app_name = 'membership'
 
app_name = 'membership'
31번째 줄: 31번째 줄:  
==탬플릿 만들기==
 
==탬플릿 만들기==
 
===login.html===
 
===login.html===
<syntaxhighlight lang="html+django">
+
기본적으로 id와 password를 입력하게 되어 있는데, 분명 모델에선 identifier를 식별필드로 지정했는데, 이 코드를 USERNAME_FIELD에 지정하기 때문인지, form 안엔 username으로 받아들이게끔 구성되어 있다. 즉, 식별필드가 무엇이든 username이라는 이름을 사용해서 로그인이 이루어지게 된다.<syntaxhighlight lang="html+django">
{% extends "연결할.html" %}
+
{% extends "base.html" %}
    
{% block content %}
 
{% block content %}
<div class="container">
+
<form method="post" action="{% url 'account:login' %}">
    <form method="post" action="{% url 'membership:login' %}">
+
    {% csrf_token %}
        {% csrf_token %}
   
<!-------------------------------------- 입력에 에러가 났을 때 불러올 html-->
 
<!-------------------------------------- 입력에 에러가 났을 때 불러올 html-->
        {% include "form_errors.html" %}
+
    {% include "form_errors.html" %}
 
<!-------------------------------------- 입력을 위한 공간-->
 
<!-------------------------------------- 입력을 위한 공간-->
        <div class="form-group">
+
    <div class="form-group">
            <label for="username">ID</label>
+
        <label for="username">ID</label>
            <input type="text" class="form-control" name="username" id="username"
+
        <input type="text" class="form-control" name="username" id="username"
                  value="{{ form.username.value|default_if_none:'' }}">
+
              value="{{ form.username.value|default_if_none:'' }}">
        </div>
+
    </div>
        <div class="form-group">
+
    <div class="form-group">
            <label for="password">비밀번호</label>
+
        <label for="password">비밀번호</label>
            <input type="password" class="form-control" name="password" id="password"
+
        <input type="password" class="form-control" name="password" id="password"
                  value="{{ form.password.value|default_if_none:'' }}">
+
              value="{{ form.password.value|default_if_none:'' }}">
        </div>
+
    </div>
        <button type="submit" class="btn btn-primary">로그인</button>
+
    <button type="submit" class="btn btn-primary">로그인</button>
     </form>
+
 
</div>
+
     <input type="hidden" name="next" value="{{ next }}"><!--로그인 성공 후 이전 페이지로 이동하게끔 하는 기능-->
 +
</form>
 
{% endblock %}
 
{% endblock %}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
===form_errors.html===
 
===form_errors.html===
membership 앱과 관련한 모든 에러메시지를 관리하기 위해 에러메시지만 띄우는 탬플릿을 만든다. 일괄적, 일관적으로 모든 공간에 적용할 수 있게끔.
+
account 앱과 관련한 모든 에러메시지를 관리하기 위해 에러메시지만 띄우는 탬플릿을 만든다. 일괄적, 일관적으로 모든 공간에 적용할 수 있게끔.
    
에러가 발생했을 때 에러메시지를 띄울 html을 불러온다.<syntaxhighlight lang="html+django">
 
에러가 발생했을 때 에러메시지를 띄울 html을 불러온다.<syntaxhighlight lang="html+django">
82번째 줄: 82번째 줄:  
==로그인, 로그아웃 성공 후 이동할 url 만들기==
 
==로그인, 로그아웃 성공 후 이동할 url 만들기==
 
===로그인 url===
 
===로그인 url===
일반적으로 <code>@login_required(login_url='membership:login')</code> 형태로 로그인 url을 써주어야 하지만, 모든 함수에 이걸 써넣긴 어렵고, 수정에도 불편하다.
+
일반적으로 <code>@login_required(login_url='account:login')</code> 형태로 로그인 url을 써주어야 하지만, 모든 함수에 이걸 써넣긴 어렵고, 수정에도 불편하다.
   −
=> settings.py에 <code>LOGIN_URL = 'membership:login'</code> 형태로 변수를 지정하면 데코레이터의 괄호에 무언가를 써주지 않아도 잘 기능한다.
+
=> settings.py에 <code>LOGIN_URL = 'account:login'</code> 형태로 변수를 지정하면 데코레이터의 괄호에 무언가를 써주지 않아도 잘 기능한다.
 
===로그인 로그아웃 후 리다이렉트===
 
===로그인 로그아웃 후 리다이렉트===
 
settings.py에서 새로운 설정항목을 만들어주어야 한다.
 
settings.py에서 새로운 설정항목을 만들어주어야 한다.
109번째 줄: 109번째 줄:  
|}
 
|}
 
===보던 페이지로 돌아가기===
 
===보던 페이지로 돌아가기===
그런데, 사실 로그인 후에 보던 페이지가 안나오면 다시 찾아들어가야 하고.. 불편하다; 다행스럽게도 로그인 기능을 제대로 구현해두면 로그인 페이지로 넘어갈 때 링크가 [http://127.0.0.1:8000/membership/login/?next=/pool/question/create/ http://127.0.0.1:8000/membership/login/?next=/보고있던페이지/] 형태로 구성된다. 이전 페이지에 대한 정보를 담고 있는데, 로그인 탬플릿에 다음의 숨겨진 항목을 추가하면 된다.(폼 안에 추가해야 한다.)<syntaxhighlight lang="html+django">
+
그런데, 사실 로그인 후에 보던 페이지가 안나오면 다시 찾아들어가야 하고.. 불편하다; 다행스럽게도 로그인 기능을 제대로 구현해두면 로그인 페이지로 넘어갈 때 링크가 [http://127.0.0.1:8000/membership/login/?next=/pool/question/create/ http://127.0.0.1:8000/account/login/?next=/보고있던페이지/] 형태로 구성된다. 이전 페이지에 대한 정보를 담고 있는데, 로그인 탬플릿에 다음의 숨겨진 항목을 추가하면 된다.(폼 안에 추가해야 한다.)<syntaxhighlight lang="html+django">
 
<input type="hidden" name="next" value="{{ next }}">
 
<input type="hidden" name="next" value="{{ next }}">
 
</syntaxhighlight>submit은 해당 링크에 대한 정보를 그대로 form으로 보내기에 <nowiki>{{next}}</nowiki>에 있는 이전페이지 주소를 받아 기능한다. 로그인 함수에서 알아서 기능해준다.
 
</syntaxhighlight>submit은 해당 링크에 대한 정보를 그대로 form으로 보내기에 <nowiki>{{next}}</nowiki>에 있는 이전페이지 주소를 받아 기능한다. 로그인 함수에서 알아서 기능해준다.
184번째 줄: 184번째 줄:  
!설명
 
!설명
 
!코드
 
!코드
|-
  −
|유저 인증
  −
|인증 정보를 객체에 담는다.
  −
|from django.contrib.auth import authenticate
  −
객체 = authenticate(username=name, password=password)
   
|-
 
|-
 
|로그인
 
|로그인
199번째 줄: 194번째 줄:  
|from django.contrib.auth import logout
 
|from django.contrib.auth import logout
 
logout(request)
 
logout(request)
 +
|}
 +
 +
= 뷰 직접 만들기 =
 +
제공되는 로그인 뷰를 사용할 수도 있지만, 로그인 중에 특수한 작업을 해야 하는 경우 직접 만들어야만 한다.
 +
{| class="wikitable"
 +
!쓸만한 모듈
 +
!설명
 +
|-
 +
|<code>from django.contrib.auth.hashers import check_password</code>
 +
|입력한 패스워드와 저장된 패스워드를 비교한다.
 +
(입력패스워드는 raw, 저장된 패스워드는 암호화 된 것)
 +
|-
 +
|<code>from django.contrib.auth import authenticate</code>
 +
|<code>user = authenticate(username=식별자, password=쌩비밀번호)</code>
 +
인증에 성공하면 user객체가 담기고, 실패하면 None을 반환한다.
 +
|-
 +
|<code>from django.contrib.auth import login</code>
 +
|<code>login(request, user)</code>
 +
유저객체를 넣으면 로그인을 진행한다.(비밀번호가 없어도 로그인 된다.)
 +
|-
 +
|<code>from django.contrib.auth import logout</code>
 +
|logout(request)
 
|}
 
|}
 
[[분류:장고 기능구현(초급)]]
 
[[분류:장고 기능구현(초급)]]

둘러보기 메뉴