처음 접하는 Django에 대해 실습을 진행하며, 그 순서를 기록하기 위해 작성한 글이다.
1. $ django-admin startapp user
- 'user' 라는 새로운 앱을 만든다
- settings.py에서 INSTALLED_APPS 에 'user'을 추가
2. UserModel을 작성한다
# user/models.py
from django.db import models
# Create your models here.
class UserModel(models.Model):
# Meta Class : DB 테이블의 이름을 지정
class Meta:
db_table = "my_user"
username = models.CharField(max_length=20, null=False)
password = models.CharField(max_length=256, null=False)
bio = models.CharField(max_length=256, default='')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
3. $ python manage.py makemigrations
- models.py에서 작성한 UserModel을 Django가 인식한다
4. $ python manage.py migrate
- 인식한 UserModel을 DB에 적용한다
- Database -> + -> Data Source from Path -> db.splite3 지정 후 Sqlite로 우측 Database 세팅
admin
1. $ python manage.py createsuperuser
- admin 계정을 생성한다
2. admin.py를 작성한다
from django.contrib import admin
from .models import UserModel
# UserModel -> Admin 추가
admin.site.register(UserModel)
Templates
{% extends 'base.html' %} : base.html을 추가
1. user/urls.py를 project/urls.py와 연결
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('user.urls')),
]
2. user/views.py 작성
from django.shortcuts import render
# Create your views here.
def sign_up_view(request):
return render(request, 'user/signup.html')
def sign_in_view(request):
return render(request, 'user/signin.html')
sign_up_view 함수가 실행되면 user/signup.html을 render
3. user/urls.py 작성
from django.urls import path
from . import views
urlpatterns = [
path('sign-up/', views.sign_up_view, name='sign-up'),
path('sign-in/', views.sign_in_view, name='sign-in'),
]
'sign-up/' url에 접속하면 views.sign_up_view 함수를 실행
회원가입
1. signup.html의 form 속성 지정 (POST)
<form class="form-area" method="post" action="/sign-up/">
{% csrf_token %}
...
</form>
2. user/views.py의 sign_up_view 메서드 수정
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
username = request.POST.get('username', None) # POST 받은 username 저장 없다면 None
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio', None)
if password != password2:
return render(request, 'user/signup.html')
else:
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
return redirect('/sign-in')
로그인
1. signin.html의 form 속성 지정 (POST)
<form class="form-area" method="post" action="/sign-in/">
{% csrf_token %}
...
</form>
2. user/views.py의 sign_in_view 메서드 수정
def sign_in_view(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
me = UserModel.objects.get(username=username)
if me.password == password:
request.session['user'] = me.username
return HttpResponse("로그인 성공!")
else:
return redirect('/sign-in')
elif request.method == 'GET':
return render(request, 'user/signin.html')
회원가입 시 중복 사용자 이름 저장 방지
1. user/views.py sign_up_view 메서드 수정
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
username = request.POST.get('username', None) # POST 받은 username 저장 없다면 None
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio', None)
if password != password2:
return render(request, 'user/signup.html')
# 회원가입 시 중복 사용자 이름 저장 방지
me = UserModel.objects.get(username=username)
if me is not None:
return render(request, 'user/signup.html')
else:
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
return redirect('/sign-in')
로그인 성공 시 화면에 접속한 사용자 이름을 출력
1. user/views.py sign_in_view 메서드 수정
def sign_in_view(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
me = UserModel.objects.get(username=username)
if me.password == password:
request.session['user'] = me.username
# 접속한 사용자 이름을 출력
return HttpResponse(me.username)
else:
return redirect('/sign-in')
elif request.method == 'GET':
return render(request, 'user/signin.html')
User 모델 업그레이드
1. user/models.py에서 UserModel을 Django에서 제공하는 auth_user 모델을 적용(상속)
# user/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# 장고가 제공하는 기본적인 auth_user table과 연동되는 클래스를 사용
class UserModel(AbstractUser):
# Meta Class : DB 테이블의 이름을 지정
class Meta:
db_table = "my_user"
bio = models.CharField(max_length=256, default='')
2. project/settings.py 에서 auth_user를 custom해서 사용하겠다고 Django에 통보
AUTH_USER_MODEL = 'user.UserModel'
3-1. $ python manage.py makemigrations
3-2. $ python manage.py migrate
- 기존 userModel에 auth_user에서 사용하는 모델을 추가해 데이터베이스에 적용
내가 작성한 bio와 auth_user의 컬럼들이 합쳐진 모델을 볼 수 있다.
4. user/view.py에서 업그레이드한 user model에 맞게 회원가입 수정
- models.py에서 auth_user(AbstractUser)를 상속받음으로써 인증과 관련된 여러가지 메서드 사용 가능
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
username = request.POST.get('username', None) # POST 받은 username 저장 없다면 None
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio', None)
if password != password2:
return render(request, 'user/signup.html')
else:
# get_user_model() : 사용자 데이터의 DB 내 존재유무 검사
exist_user = get_user_model().objects.filter(username=username)
if exist_user:
return render(request, 'user/signup.html')
else:
# django의 auth_user에 존재하는 create_user 사용
UserModel.objects.create_user(username=username, password=password, bio=bio)
return redirect('/sign-in')
5. user/view.py에서 업그레이드한 user model에 맞게 로그인 수정
def sign_in_view(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
# 인증 기능 모듈을 먼저 불러온다
# authenticate : 암호화된 비밀번호와 현재 입력된 비밀번호와 일치하는지 그게 사용자와 맞는지까지 확인
me = auth.authenticate(request, username=username, password=password)
if me is not None:
auth.login(request, me) # 세션과 같은 로그인과 관련된 처리들을 django가 해준다
return HttpResponse(me.username) # 접속한 사용자 이름을 출력
else:
return redirect('/sign-in')
elif request.method == 'GET':
return render(request, 'user/signin.html')
'Backend > Django' 카테고리의 다른 글
[파이썬] Django - SNS 기초 실습 6) 회원가입/로그인/친구 서비스 디테일 (0) | 2022.05.30 |
---|---|
[파이썬] Django - SNS 기초 실습 5) Follow (ManyToMany) (0) | 2022.05.30 |
[파이썬] Django - SNS 기초 실습 4) Tweet (조회, 댓글) (0) | 2022.05.27 |
[파이썬] Django - SNS 기초 실습 3) Tweet (게시글) (0) | 2022.05.27 |
[파이썬] Django - SNS 기초 실습 2) Tweet (홈 화면) (0) | 2022.05.27 |