본문 바로가기
Language/파이썬

장고(django) 로그인 기능 - 파이썬 장고를 활용한 쉽고 빠른 웹 개발 프로그래밍

by javapp 자바앱 2022. 2. 2.
728x90

 

장고 로그인 기능

 

 

Model 테이블 (User model)

 

django.contrib.auth | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

 

 

Creating forms from models | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

모델 필드양식 필드

AutoField 형식으로 표시되지 않음
BigAutoField 형식으로 표시되지 않음
BigIntegerField IntegerFieldmin_value-9223372036854775808  설정하고 9223372036854775807로 max_value설정합니다.
BinaryField CharField, 모델 필드에서 editable로 설정되어 있으면 True양식에 표시되지 않습니다.
BooleanField BooleanField, 또는 NullBooleanField경우 null=True.
CharField CharField max_length모델 필드의 설정 max_length empty_value 세트 None의 경우 null=True.
DateField DateField
DateTimeField DateTimeField
DecimalField DecimalField
DurationField DurationField
EmailField EmailField
FileField FileField
FilePathField FilePathField
FloatField FloatField
ForeignKey ModelChoiceField (아래 참조)
ImageField ImageField
IntegerField IntegerField
IPAddressField IPAddressField
GenericIPAddressField GenericIPAddressField
JSONField JSONField
ManyToManyField ModelMultipleChoiceField (아래 참조)
PositiveBigIntegerField IntegerField
PositiveIntegerField IntegerField
PositiveSmallIntegerField IntegerField
SlugField SlugField
SmallAutoField 형식으로 표시되지 않음
SmallIntegerField IntegerField
TextField CharField ~와 함께 widget=forms.Textarea
TimeField TimeField
URLField URLField
UUIDField UUIDField

 

 


 

 

셋팅

로그인, 로그아웃 관련 지정하는 항목

 

LOGIN_URL

기본 : '/accounts/login/'

로그인 페이지로 리다이렉트되는 URL

LOGIN_REDIRECT_URL

로그인된 후 리다이렉트

LOGOUT_REDIRECT_URL

로그아웃 이후 지정된 URL로 리다이렉트

 

settings.py

# LOGIN_URL = '/accounts/login/
LOGIN_REDIRECT_URL = '/'

INSTALLED_APPS = [
	...
	'widget_tweaks',               # 폼 장식
]

 

 

Settings | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

 


 

 

URLconf

mysite/urls.py

from mysite.views import UserCreateView, UserCreateDoneTV
urlpatterns = [
...
    # 인증 관련 URL 3개 추가, accounts/로 시작하는 것으로 통일
    path('accounts/', include('django.contrib.auth.urls')),                            # 템플릿 URL 패턴에 영향
    path('accounts/register/', UserCreateView.as_view(), name='register'),
    path('accounts/register/done/', UserCreateDoneTV.as_view(), name='register_done'),
...
]

 

장고 Auth 앱은 /login/, /logout/ 처럼 URL 정의, 그 앞에 URL 추가 하기 원한다면 표시

 

 


 

 

View

INSTALLED_APPS = [
# 기본
    'django.contrib.admin',
    'django.contrib.auth',

LoginView 등은 기본으로 auth 모듈이 등록돼 있어서 

장고가 실행될 때 auth 모듈의 view.py 파일에 정의된 뷰가 활성화 된다.

 

 

mysite/views.py

# 홈페이지

from django.views.generic import TemplateView

from django.views.generic import CreateView
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy                    # urls.py 모듈이 로딩 될때

class HomeView(TemplateView):
    template_name = 'home.html'

# 유저 생성
# /accounts/register/url
class UserCreateView(CreateView):
    template_name = 'registration/register.html'
    form_class = UserCreationForm                       # 유저이름 적는 EditText
    success_url = reverse_lazy('register_done')         # /accounts/register/done URL로 리다이렉트

# /accounts/register/done/url
class UserCreateDoneTV(TemplateView):                   # URL 처리해주는 뷰, 템플릿만 보여줌
    template_name = 'registration/register_done.html'   # User 레코드 생성, 가입 처리 후 보여줄 템플릿 파일 명

 

 

CreateView

 

 

Generic editing views | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

제네릭 에디팅 뷰(편집용 제네릭 뷰)중 하나

 

테이블에 새로운 레코드를 생성하기 위해 필요한 폼

폼에 입력된 데이터로 테이블의 레코드를 생성해주는 뷰

 

이외에도 FormView, UpdateView, DeleteView

 

 

Form

form_class = UserCreationForm

 

A ModelForm for creating a new user.

It has three fields: username (from the user model), password1, and password2. It verifies that password1 and password2 match, validates the password using validate_password(), and sets the user’s password using set_password().

 

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

 

 

장고의 기본 Form

{{ form.as_p }} : https://opentutorials.org/module/4034/24651

 

 

reverse_lazy

    success_url = reverse_lazy('register_done')         # /accounts/register/done URL로 리다이렉트

폼에 입력된 내용에 에러가 없고 , 테이블 레코드 생성이 완료된 후에 이동할 URL 지정

 

 

 


 

 

Template

templates/base.html

<!--       로그인 form 영역 -->
          <form class="form-inline my-2" action="" method="post" role="search">
              {% csrf_token %}
                <input class="form-control mr-sm-2" type="search" placeholder="global search" name="search_word">
          </form>

          <ul class="navbar-nav ml-5 mr-5">
              <li class="nav-item dropdown mx-1 btn btn-primary">
                {% if user.is_active %}
                    <a class="nav-link dropdown-toggle text-white" href="#" data-toggle="dropdown">
                        <i class="fas fa-user"></i>&ensp;{% firstof user.get_short_name user.get_username %}&ensp;
                    </a>
                    <div class="dropdown-menu">
                        <a class="dropdown-item" href="{% url 'logout' %}">Logout</a>
                        <a class="dropdown-item" href="{% url 'password_change' %}">Change</a>
                    </div>
                {% else %}
                <a class="nav-link dropdown-toggle text-white" href="#" data-toggle="dropdown">
                    <i class="fas fa-user"></i>&ensp;익명&ensp;
                </a>
                <div class="dropdown-menu">
                    <a class="dropdown-item" href="{% url 'login' %}">Login</a>
                    <a class="dropdown-item" href="{% url 'register' %}">Register</a>
                </div>
                {% endif %}
              </li>
          </ul>

 

※ User 객체

user 객체는 장고의 기본 템플릿 변수 이므로, 모든 템플릿 파일 사용 가능

{% if user.is_active %}

is_active

Boolean. Designates whether this user account should be considered active. We recommend that you set this flag to False instead of deleting accounts; that way, if your applications have any foreign keys to users, the foreign keys won’t break.

 

 

 

 

django.contrib.auth | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

<i class="fas fa-user"></i>&ensp;{% firstof user.get_short_name user.get_username %}

{% firstof x y %} : 다음 오는 인자들 중에서 False가 아닌 첫 인자를 선택

user.get_short_name : User 객체의 first_name

user.get_username : User 객체의 username  

 

{% url 'logout' %} : 장고 기본 url , /accounts/login/

 

 


 

기본 제공

templates/registration/login.html

{% extends "base.html" %}
{% load widget_tweaks %}

{% block title %}login.html{% endblock %}

{% block content %}
    <h1>Please Login</h1>
    <p class="font-italic">Please enter your id and password.</p>

    {% if form.error %}
    <div class="alert alert-danger">
        <div class="font-weight-bold">모두 작성해 주세요</div>
        {{ form.errors }}
    </div>
    {% endif %}

    <form action="." method="post" class="card pt-3">{% csrf_token %}
        <div class="form-group row">
<!--            widget_tweaks 라이브러리에서 제공하는 add_label_class 필터를 통해 <label> 태그에 부트스트랩 적용 -->
            {{ form.username|add_label_class:"col-form-label col-sm-2 ml-3 font-weight-bold" }}
            <div class="col-sm-5">
                {{ form.username|add_class:"form-control"|attr:"autofocus" }}
            </div>
        </div>
        <div class="form-group row">
            {{ form.password|add_label_class:"col-form-label col-sm-2 ml-3 font-weight-bold" }}

            <div class="col-sm-5">
                {{ form.password|add_class:"form-control" }}
            </div>
        </div>
        <div class="form-group">
            <div class="offset-sm-2 col-sm-5">
                <input type="submit" value="Log in" class="btn btn-info"/>
                <input type="hidden" name="next" value="{{ next }}"/>
<!--             폼 제출시 폼의 next 변수값을 할당, next : LoginView 뷰에서 넘겨줌, /accounts/login/?next=/post/3/
                 없으면 settings.LOGIN_REDIRECT_URL 항목에 지정된 URL 사용 : /accounts/profile/URL
-->
            </div>
        </div>
    </form>
{% endblock %}

 

 AuthenticationForm

<!--            widget_tweaks 라이브러리에서 제공하는 add_label_class 필터를 통해 <label> 태그에 부트스트랩 적용 -->
            {{ form.username|add_label_class:"col-form-label col-sm-2 ml-3 font-weight-bold" }}

form 변수는 LoginView 뷰에서 넘겨주는 AuthenticationForm 객체

로그인용 기본 폼

 

class AuthenticationForm

A form for logging a user in.

Takes request as its first positional argument, which is stored on the form instance for use by sub-classes.

 

https://docs.djangoproject.com/en/4.0/topics/auth/default/#django.contrib.auth.forms.AuthenticationForm

 

 

 

직접 개발

templates/registration/register.html

{% extends "base.html" %}
{% load widget_tweaks %}

{% block title %}register.html{% endblock %}

{% block content %}

    <h1>New User Registration</h1>
    <p class="font-italic">Please enter your username and password twice.</p>

    {% if from.errors %}
    <div class="alert alert-danger">
        <div class="font-weight-bold">Please correct the error(s) below.</div>
        {{ form.errors }}
    </div>
    {% endif %}

    <form action="." method="post" class="card pt-3">{% csrf_token %}
        <div class="form-group row">
            {{ form.username|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
            <div class="col-sm-5">
                {{ form.username|add_class:"form-control"|attr:"autofocus" }}
            </div>
        </div>
        <div class="form-group row">
            {{ form.password1|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
            <div class="col-sm-5">
                {{ form.password1|add_class:"form-control" }}
            </div>
        </div>
<!--    비빌 번호 확인 -->
        <div class="form-group row">
            {{ form.password2|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
            <div class="col-sm-5">
                {{ form.password2|add_class:"form-control" }}
            </div>
        </div>
        <div class="form-group">
            <div class="offest-sm-3 col-sm-5">
                <input type="submit" value="Register" class="btn btn-info"/>
            </div>
        </div>
    </form>
{% endblock %}

 

CreateView 를 사용

class UserCreateView(CreateView):

 

사용자 계정을 생성하기 위해 비밀번호를 두 번 입력할 수 있도록 password1 , password2 요소 있다.

            {{ form.username|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}

            {{ form.password1|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}

            {{ form.password2|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}

 

 

 

 

직접 개발

templates/registration/register_done.html

더보기
{% extends "base.html" %}

{% block title %}password_change_done{% endblock %}

{% block content %}
<!--  auth.views.PasswordChangeDoneView 뷰에서 "Password change successful"이라는 문장으로 지정  -->
    <h1>{{ title }}</h1>

    <br>

    <p>패스워드 변경 완료 !</p>
{% endblock %}

 

 

 

기본 제공

templates/registration/password_change_form.html

더보기
{% extends "base.html" %}
{% load widget_tweaks %}

{% block title %}password_change_form.html{% endblock %}

{% block content %}

  <h1>{{ title }}</h1>
  <p class="font-italic">패스워드 변경</p>

  {% if form.errors %}
    <div class="alert alert-danger">
      <div class="font-weight-bold">에러 수정해 주세요</div>
      {{ form.errors }}
    </div>
  {% endif %}

  <form action="." method="post" class="card pt-3">{% csrf_token %}
    <div class="form-group row">
      {{ form.old_password|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
      <div class="col-sm-5">
        {{ form.old_password|add_class:"form-control"|attr:"autofocus" }}
      </div>
    </div>
    <div class="form-group row">
      {{ form.new_password1|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
      <div class="col-sm-5">
        {{ form.new_password1|add_class:"form-control" }}
      </div>
    </div>
    <div class="form-group row">
      {{ form.new_password2|add_label_class:"col-form-label col-sm-3 ml-3 font-weight-bold" }}
      <div class="col-sm-5">
        {{ form.new_password2|add_class:"form-control" }}
      </div>
    </div>

<!-- 변경 버튼 -->
    <div class="form-group">
      <div class="offset-sm-3 col-sm-5">
        <input type="submit" value="Password change" class="btn btn-info"/>
      </div>
    </div>

  </form>

{% endblock %}

 

 

 

기본제공

templates/registration/password_change_done.html

더보기
{% extends "base.html" %}

{% block title %}password_change_done{% endblock %}

{% block content %}
<!--  auth.views.PasswordChangeDoneView 뷰에서 "Password change successful"이라는 문장으로 지정  -->
    <h1>{{ title }}</h1>

    <br>

    <p>패스워드 변경 완료 !</p>
{% endblock %}

 

 

 

templates/registration/logged_out.html

더보기
{% extends "base.html" %}

{% block title %}logged_out.html{% endblock %}

{% block content %}

    <h1>Logged out</h1>
    <br>

    <div>
        <i class="fas fa-quote-left"></i>
        <span class="h6">&ensp;Thanks for spending your quality time with this web site today.&ensp;</span>
        <i class="fas fa-quote-right"></i>
    </div>

    <p class="font-italic"><a href="{% url 'login' %}">Log in again</a></p>

{% endblock %}

 

 

 

 

 

 

댓글