백엔드 공부/Django

[Django] 장고 로그인, 로그아웃 구현

박현준(-ㅅ-) 2023. 1. 19. 17:41

 

저는 현재 Python IDE로 파이참 프로를 사용하고 있습니다.

파이참 터미널을 통해 진행하겠습니다.

우선 하나의 앱에 로그인, 로그아웃, 회원가입 기능을 종속시키는 것은 그리 좋은 방법이 아니므로

users앱을 생성 및 세팅 진행하겠습니다.

 

1.users 앱 생성 

$ django-admin startapp users

2.settings.py의 INSTALLED_APPS에 앱 등록 

3. users앱에 urls.py 생성

4. 프로젝트 urls.py에 url연결

이제 users/ 로 시작하는 URL은 모두 user/urls.py파일을 참조합니다.

 

여기까지가 앱 생성 및 세팅이었습니다.


지금부터는 로그인 구현에 대해 알아보겠습니다.

우선 저는 네비게이션-바 오른쪽에 로그인 링크를 넣을 계획입니다.

1. 로그인 링크 

 

저는 css 적용은 인라인 방식으로 적용하고 있습니다.

 <a style="font-size: 25px;text-decoration-line: none;color: #ef86f1"
                       href="{% url 'users:login' %}"><strong>로그인</strong></a>

그리고 열결 될 링크에는 템플릿 코드를 사용했습니다. {%  %} 안에 내용은 users파일에 있는 urls.py에서 login을 찾아라 라는 뜻입니다. 

name이 login으로 되어있는 url을 찾는 방법입니다.

 

users/urls.py입니다. 로그인 뷰는 따로 설정 없이 django.contrib.auth앱의 LoginView를 사용했습니다.

여기서 만약 에러가 발생한다면 아마 template_name 때문이라고 생각합니다. 사용할 html파일이 어디 있는지 적어주세요.

users폴더에 templates폴더를 만들어서 html파일을 관리하고 있습니다.

3. login.html 작성

 

지금까지의 과정은 네비게이션-바에 링크를 달고 거기에 맞게 django내부에서 urls.py를 이용해 url을 연결시켜 주었습니다. 이제 연결했으니 보여줘야 할 페이지를 작성해야겠죠.

 

users/login.html에 아래와 같이 작성해 주세요.

<!--로그인-->


    {% block content %}
        <div class="container my-3">
            <form method="post" action="{% url 'users:login' %}">
                {% csrf_token %}
                {% include "users/form_errors.html" %}

                <div class="mb-3">
                    <label for="username" style="font-size: 25px">사용자ID</label>
                    <input type="text" class="form-control" name="username" id="username"
                           value="{{ form.username.value|default_if_none:'' }}">
                </div>
                
                <div class="mb-3">
                    <label for="password" style="font-size: 25px">비밀번호</label>
                    <input type="password"w class="form-control" name="password" id="password"
                           value="{{ form.password.value|default_if_none:'' }}">
                </div>
                <button type="submit" class="btn btn-primary"><strong>로그인</strong>
                </button>
            </form>
        </div>
    {% endblock %}

    <!--로그인-->

django.contrib.auth앱은 username과 password는 필수항목으로 요구합니다.

4. 로그인 시 에러를 보여주는 form_errors.html 작성

 

users앱/templates/users파일에 form_errors.html을 생성하고 아래와 같이 작성합니다.

<!-- 필드 오류와 넌필드 오류를 출력한다. -->
{% if form.errors %}
<div class="alert alert-danger">
    {% for field in form %}
    <!-- 필드 오류 -->
    {% if field.errors %}
    <div>
        <strong>{{ field.label }}</strong>
        {{ field.errors }}
    </div>
    {% endif %}
    {% endfor %}
    <!-- 넌필드 오류 -->
    {% for error in form.non_field_errors %}
    <div>
        <strong>{{ error }}</strong>
    </div>
    {% endfor %}
</div>
{% endif %}

필드 오류(field.eroors)는 유저가 입력한 값에 대한 오류(누락이나 형식이 일치하지 않음)

넌필드 오류(form.non_field_errors)는 값과 상관없는 다른 이류로 발생하는 오류

 

5. superuser생성

 

로그인을 하기 위해서는 우선 superuser를 생성해 주세요.

# 터미널에 입력
$ python3 manage.py createsuperuser

# 그럼 ID와 PassWord를 입력하라고 나옵니다.

 

위 사진처럼 로그인 기능이 완성됐습니다. 색깔은 제가 따로 css에 인라인 방식으로 넣었습니다.

하지만 ID랑 PassWord를 입력하고 로그인 버튼을 누르면 아래 사진처럼 나올 겁니다. 이는 정확히 정상적입니다.

왜냐하면 로그인 후 어떤 페이지를 보여줄지 안 정했기 때문이죠.

 

setting.py 맨 아래에 아래 코드를 추가시켜 줍니다.

# 로그인 성공 후 이동하는 URL
LOGIN_REDIRECT_URL = '/'

이 말은 로그인 후 /로 시작하는 즉 http://localhost:8000/ 페이지로 이동한다는 뜻입니다.

그럼 이제 이에 맞게 매핑 규칙을 추가해야 합니다.

 

번외 : 프로젝트 구성 보조 설명

참고로 저는 project, users, ShowMeSchool 이렇게 3가지로 구성되어 있습니다. 

ShowMeSchool/urls.py에서 project.urls.py의 규칙을 포함한다고 나와있습니다.

그리고 project/urls.py에서는 ' '라고 되어있는데 /다음에 아무것도 없을 때 view를 적용한다라는 뜻입니다.

그리고 project.views에는 index.html(메인페이지)를 요청에 따라 렌더링 하는 뷰입니다.

 

여기까지 하면 로그인이 잘 되어야 합니다!


지금부터는 로그아웃에 대해 알아보겠습니다.

 

로그아웃은 간단합니다.

1. 로그아웃 링크

 

우선 보통 로그인 상태가 되면 로그인 링크는 사라지고 로그아웃 링크만 남죠

이를 위해서는 현재 유저가 로그인 상태인지 아닌지를 판별하는 템플릿 코드가 있습니다.

{% if user.is_authenticated %}입니다.

 {% if user.is_authenticated %}
	<a href="{% url 'users:logout' %}"><strong>{{ user.username }} (로그아웃)</strong></a>

{% else %}

	<a href="{% url 'users:login' %}"><strong>로그인</strong></a>
{% endif %}
2. 로그아웃 url 설정

 

이제 로그아웃 링크에 대한 url을 설정해 주겠습니다.

# users/urls.py

urlpatterns = [
	...
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]


# ShowMeSchool/settings.py
# 로그아웃 시 이동 하는 URL

LOGOUT_REDIRECT_URL = '/'

 

이렇게 두 파일에 코드를 추가해 주면 로그아웃 기능이 정상적으로 실행됩니다.

 

 

느낀 점

이번에 공부하며 느낀 점이라면 개인 토이프로젝트를 하며 점프 투 장고를 보며 다시 감을 잡으며 로그인, 로그아웃을 구현했는데 추가적으로 보완할 부분도 많고 추가적인 기능을 넣어야 하는 부분이 많습니다. 그리고 아직 더 깊게 공부해보지는 않아서 모르지만 완벽하게 보안이 되는지 POST방식으로 쏠 때는 csrf_token같이 형식적이지만 보안적인 부분을 아직 제대로 알고 있지 않아 이후에 더 공부할 생각입니다.

 

꽤 긴 글이였지만 읽어주셔서 감사합니다.

 

 

그리고 [점프 투 장고]를 참고해 쓰는 글임을 알려드립니다. 좋은 책입니다 ㅎㅎ 부트스트랩과 장고로 게시판을 만드는 책입니다. 서비스 개발부터 서비스 오픈까지 담겨있는 책입니다. 추천추천!

https://wikidocs.net/71259

 

3-05 로그인과 로그아웃

* `[완성 소스]` : [github.com/pahkey/jump2django/tree/3-05](https://github.com/pahkey/jump2django/tree/…

wikidocs.net