본문 바로가기
언어/PYTHON

[Django] Custom User 적용 AbstractUser

by HmHjj 2022. 12. 8.
728x90
반응형

Django 프로젝트에 AbstractUser 적용 

Django 프로젝트에 AbstractUser 적용하는 방법을 정리하겠습니다.  

 

Django 프로젝트에 AbstractUser 구성 방법

 

model.py
from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    phone = models.CharField(max_length=20, blank=True, null=True)
    updatedDate = models.DateTimeField(auto_now=True)

기존 유저 구조에 User에 필요한 field를 추가 할수 있으니 원하는 것을 추가하면 된다. 

 

views.py
from django.shortcuts import render, redirect
from django.views import View
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse
from testapp.models import User

# Create your views here.
class LoginView(View):
    def get(self,request):
        return render(request, 'login.html')

    def post(self, request):
        req = request.POST
        username = req['username']
        password = req['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user=user)
            return redirect("/")
        else:
            return HttpResponse("Unauthorized", status=400)

class SignUpView(View):
    def get(self,request):
        return render(request, 'signup.html')

    def post(self, request):
        req = request.POST
        username = req['username']
        password = req['password']
        User.objects.create_user(username=username,password=password)
        return HttpResponse("User created", status=200) 

class LogOutView(View):
    def post(self, request):
        logout(request)
        return redirect('/')

 

  • Login
    • authenticate 함수로 접속을 확인
    • login 함수고 접속
    • GET 에 연결 page 를 render 함수로 login.html 파일 적용
  • Signup
    • create_user 함수로 user 와 password로 저장 _user 붙은 함수는 password를 암호화 해서 저장해준다. 
      • create 로 만들 경우 password에 값 그대로 저장 된다. 
    • GET 에 연결 page를 render 함수로  signup.html 파일 적용
  • Logout
    • POST에서 logout 함수로 바로 로그아웃 해준다. 

 

HTML 테스트 파일 

testapp 폴더 아래에 templates 라는 폴더를 생성해준다. 바로 인식하기에 폴더명만 맞추면 된다. 

 

testapp/templates/login.html
<form method="POST" action="{% url 'login' %}">
    {% csrf_token %}
    <p>username</p>
    <input type="text" name="username">
    <br>
    <p>password</p>
    <input type="text" name="password">
    <br>
    <input type="submit" value="login">
</form>

 

testapp/templates/signup.html
<form method="POST" action="{% url 'signup' %}">
    {% csrf_token %}
    <p>username</p>
    <input type="text" name="username">
    <br>
    <p>password</p>
    <input type="text" name="password">
    <br>
    <p>confirm</p>
    <input type="text" name="confirm">
    <br>
    <input type="submit" value="register">
</form>

 

mysite/urls.py
from django.contrib import admin
from django.urls import path
from testapp.views import LoginView, SignUpView, LogOutView

urlpatterns = [
    path('login/', LoginView.as_view(), name="login"),
    path('signup/', SignUpView.as_view(), name="signup"),
    path('logout/', LogOutView.as_view(), name="logout"),
]

path에 접속 url 을 넣어주고 testapp 에 view를 연결해 준다. 

 

mysite/settings.py
AUTH_USER_MODEL = 'testapp.User'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

AbstractUser 사용시에 Setting에서 auth user 모델을 설정해줘야하며 DEFAULT_AUTO_FIELD 도 설정해줘야 warning 이 안뜬다. CSRF 설정을 위해 middelware에 django.middleware.csrf.CsrfViewMiddleware 를 추가해준다. 

 

여기까지 하고 migrate 작업 해주고 실행해 보자. 

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

 

웹에서 http://localhost:8000/signup/ 으로 localhost는 각자 맞게 변경하시어 접속해보면 아래와 같은 간단한 화면을 볼수 있다. 항목 체워서 resgister를 누르면 등록이 된다. 

 

test user 등록 화면
등록 성공 메시지

 

sqlite DB 확인

python manage.py dbshell 로 db에 어떻게 생성 되었는지 확인하자.  db.sqlite3 파일의 내용을 확인 할수 있다. 

$ python manage.py dbshell
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite>

 

DB 파일명 및 테이블 리스트 확인

sqlite> .database
main: /home/test/mysite/db.sqlite3
sqlite> .tables
auth_group                     django_migrations            
auth_group_permissions         django_session               
auth_permission                testapp_user                 
django_admin_log               testapp_user_groups          
django_content_type            testapp_user_user_permissions
sqlite>

 

user 테이블 확인

sqlite> select * from testapp_user;
1|pbkdf2_sha256$390000$tECCusXUT7XNQteWvlwj8b$DVPzL2MtCxWD9rfCW2vr9ihkof8QgHoc01juk9qo92I=||0|test||||0|1|2022-12-08 01:31:06.195738||2022-12-08 01:31:06.285785
sqlite>

 

 

728x90
반응형

'언어 > PYTHON' 카테고리의 다른 글

[Python] Selenium 예약 프로그램 기능  (0) 2023.04.11
[Django] Custom User 적용  (0) 2022.12.02
[Django] 프로젝트 실행  (1) 2022.12.01
[Django] Python 환경 구성  (0) 2022.11.30

댓글