장고 프레임워크는 MVT 모델로 이루어있는데, Django에 내장된 User를 이용하면 model을 따로 만들어줄 필요가 없다.

  • 대신 forms.py를 만들어서 로그인, 회원가입 폼을 만들어야 한다.

1. forms.py

  • UserCreateForm은 django.contrib.auth.forms의 UserCreateForm 에서 오버라이딩한 클래스이다.
class UserCreateForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ("email", "username")

    def save(self, commit=True):
        user = super(UserCreateForm, self).save(commit=False)
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user

    # Help메시지가 표시되지 않도록 수정
    def __init__(self, *args, **kwargs):
        super(UserCreateForm, self).__init__(*args, **kwargs)

        for fieldname in ['username', 'password1', 'password2']:
            self.fields[fieldname].help_text = None

2. urls.py

  • views.py와 template의 url을 연결해주는 역할을 한다.
from django.conf.urls import url
from . import views

urlpatterns = [
    url('join/', views.create_user, name="join"),
    url('login/', views.sign_in, name="login"),
    url('logout/', views.sign_out, name='logout'),
]

3. views.py

  • urls.py에서 지정한 url과 연결되는 메소드 - 회원가입, 로그인, 로그아웃 기능- 을 구현한다.
  • 대부분의 기능이 기존 authentication에 함수로 내장되어 있어서 잘 사용하기만 하면 된다.
    • 회원가입
    • 로그인/로그아웃
from django.shortcuts import render
# Create your views here.

from .forms import UserCreateForm 
from django.contrib.auth.models import User 
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.forms import AuthenticationForm

def create_user(request):
    if request.method == 'POST':  
        try:  
            username = request.POST['username']
            email = request.POST['email']
            password = request.POST['password1']
            new_user = User.objects.create_user(username, email, password) 
            new_user.save()
            return render(request, 'registration/signup_done.html', {'message': '회원가입이 완료됨'})
        except:
            return render(request, 'registration/signup_done.html', {'message': '회원이 이미 있음'})
    else:
        form = UserCreateForm()
        return render(request, 'registration/signup.html', {'form': form})
def sign_out(request):
    logout(request)
    return render(request, 'home/base.html')


def sign_in(request):
    if request.method == 'POST':
        user = authenticate(request, username=request.POST.get('username',''), password=request.POST.get('password',''))
        if user is not None:
            login(request, user)
        return render(request, 'registration/login.html', {'message': "로그인 되었습니다."})
    else:
        form = AuthenticationForm()
        return render(request, 'registration/login.html', {'form': form})

4. template

  • 넘어가는 메뉴(home/navbar.html)
<div class="dropdown-menu">
    <a class="dropdown-item" href="{% url 'login' %}">Login</a>
    <a class="dropdown-item" href="{% url 'join' %}">Register</a>
</div>
  • registration/login.html
{% extends 'home/base.html' %}
{% block content %}
<div id="content-wrapper">
    <div class="container-fluid">
        <div>
            <h1>Login</h1>
        </div>
        <form method="post" action="{% url 'login' %}">
            {% csrf_token %}
            {{ form.as_p }}
            <div><button type="submit", class="btn btn-success", value="save">Submit Login</button>
            </div>
        </form>
        <a href="{% url 'index' %}"><button type="button" class="btn btn-primary">Back to List</button></a>
    </div>
</div>
{% endblock content %}
  • registration/signup.html
{% extends 'home/base.html' %}
{% block content %}
<div id="content-wrapper">
    <div class="container-fluid">
        <div>
            <h1>New User Registration</h1>
        </div>
        <form method="post" action="{% url 'join' %}">
            {% csrf_token %}
            {{ form.as_p }}
            <div><button type="submit", class="btn btn-success", value="save">Submit Registration</button>
            </div>
        </form>
        <a href="{% url 'index' %}"><button type="button" class="btn btn-primary">Back to List</button></a>
    </div>
</div>
{% endblock content %}

5. 결과 화면

  • 회원가입

  • 회원가입 후

  • 로그인

  • 로그인 후

+ 참고로...

유저가 추가된 것을 localhost:8000/admin에서 admin계정을 통해서 확인할 수 있다.

  • 이전에 test로 만든 계정들을 확인할 수 있다.

  • 추가할 기능 : 개인 계정 업데이트 및 관리
  • 앞으로의 방향 : 유저에 다양한 필드를 갖추기 위해서는 기본적으로 제공되는 user에 한계점이 보여서 다른 user를 사용해서 구현할 것.

- 참고 : m.blog.naver.com/PostView.nhn?blogId=rudnfskf2&logNo=221377212957&proxyReferer=https:%2F%2Fwww.google.com%2F

[

20. Django authentication를 활용한 회원가입 구현

이번 포스트에서는 장고에서 자체적으로 내장하고 있는 authentication를 활용하여 회원가입을 구현하는 것...

blog.naver.com

](https://m.blog.naver.com/PostView.nhn?blogId=rudnfskf2&logNo=221377212957&proxyReferer=https:%2F%2Fwww.google.com%2F)


WRITTEN BY
choco-songyi

,

왜? db를 확인하고 싶어서 localhost:8080/admin으로 접속했는데 계정 정보를 모름!

1. django shell에 들어가서 계정 정보를 확인한다.

(venv) C:\Users\user\PycharmProjects\DjangoProject\insta>python manage.py shell
Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.auth.models import User
>>> superusers = User.objects.filter(is_superuser=True)
>>> superusers
<QuerySet [<User: kho903>]>
>>>

 

2. 패스워드를 바꾸어준다.

- 너무 쉬우면 계속 다시 하라고 함.

(venv) C:\Users\user\PycharmProjects\DjangoProject\insta>python manage.py changepassword kho903
Changing password for user 'kho903'
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Password:
Password (again):
Password changed successfully for user 'kho903'

3. localhost:8000/admin/auth/user에서 확인해보기

- /admin 에서 로그인

 

 

- test로 회원가입한 user 두 명이 있는 것을 확인할 수 있음.

 

*** 새로 superuser 계정을 만들어줄 수도 있음.

(venv) C:\Users\user\PycharmProjects\DjangoProject\insta>python manage.py createsuperuser
Username (leave blank to use 'user'): mink
Email address:
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

WRITTEN BY
choco-songyi

,