Sparta Coding Club/Today I Learned [TIL]

[TIL] #DAY - 019 - 파이썬 장고 실무 기초 (3) (내일배움캠프AI 3기)

양한마리 2022. 9. 26. 20:02
728x90



5주차 시작!

월요일 시작부터 쪽지시험이라니

갑자기 생각도못한 시험이라 정신없이 오전 보냈네..

시험은 못봤지만

아무튼

오들도 화.이.팅!

 



[목차]

01. 사용자 관리와 로그인 - 회원가입 기능 만들기

02. 사용자 관리와 로그인 - 로그인 기능 만들기

03. User모델 업그레이드 하기

04. User모델을 데이터베이스에 적용시키기


 

01.  사용자 관리와 로그인 - 회원가입 기능 만들기

* GET 과 POST 활용하기


1) user의 views.py sign_up_view에 POST 추가하기

  • user앱의 views.py의 sign_up_view 함수에 HTTP 요청 방식을 구분 하는 코드를 추가
# user/views.py
def sign_up_view(request):
    if request.method == 'GET': # GET 메서드로 요청이 들어 올 경우
        return render(request, 'user/signup.html')
    elif request.method == 'POST': # POST 메서드로 요청이 들어 올 경우
        
        return ""

2) HTML에서 form태그 설정

  • signup.html의 <form>태그 의 속성에 method와 action을 추가 하려고 해요! 아래의 코드를 form태그에 적용
<!-- 윗 부분 생략 -->
<div class="wrap">
    <h2 class="title-center"> 회원가입 </h2>
    <form class="form-area" method="post" action="/sign-up/">
        {% csrf_token %}  <!-- {% csrf_token %} 은 Django에서 post 할 때에 보안을 위해서 사용 -->
        <div class="form-group mt-2 mb-2">
            <label for="username">이름</label>
            <input type="text" class="form-control" id="username" name="username">
        </div>
        <div class="form-group mt-2 mb-2">
<!-- 아랫 부분 생략 -->

<form>태그의 가장 마지막에 있는 <button type="submit" class="btn btn-primary">회원가입</button> 버튼은, form태그의 method로 action에 데이터를 보내주는 역할

3) user의 views.py에서 전송되는 데이터 받아서 저장하기

  • html의 input에 입력 했던 친구들은 각각 username, password, password2, bio로 sign_up_view()함수로 적용
  • html에서 넘겨준 데이터를 views.py에서 받아줍니다.
  • password와 password2가 일치하는지 확인 해 주고, 일치하면 저장 해 줍니다.
  • user앱의 views.py의 sign_up_view함수에 아래와 같이 추가 해 주겠습니다.
from django.shortcuts import render, redirect
from .models import UserModel

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)
        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')
  • redirect 함수를 이용해서, 저장 완료 되었다면 로그인 페이지 인 /sign-in url로 이동 하게 해 줍니다.

02.  사용자 관리와 로그인 - 로그인 기능 만들기


1) user model을 사용한 로그인 절차 만들기

  • url, view 세팅하기 
    • views.py의 sign_in_view에 POST 를 추가
# user/views.py
from django.http import HttpResponse

def sign_in_view(request):
		if request.method == 'POST':
        return HttpResponse("로그인 성공!")
    elif request.method == 'GET':
        return render(request, 'user/signin.html')
  • signin.html 의 form 태그 속성 넣기
    • 작성한 url과 view로 html에서 데이터를 넘겨주어야 합니다.
    • signin.html의 `form태그`에 action과 method를 추가
<!-- 윗부분 생략 -->
<div class="wrap">
    <h2 class="title-center"> 로그인</h2>
    <form class="form-area" action="/sign-in/" method="post">
        {% csrf_token %}
        <div class="form-group mt-2 mb-2">
<!-- 아랫 부분 생략 -->

위와 같이 form 태그 부분을 수정한다. // form태그는 이 두 친구들을 /sign-in url로 보내줍니다.

  • view의 로그인 작업 마무리하기
    • username, password가 /sign-in으로 전달 되기 때문에, 'sign_in_view'함수가 실행이 됩니다.
    • user앱의 sign_in_view 함수에 로그인 기능들을 추가
# user/views.py
def sign_in_view(request):
    if request.method == 'POST':
        username = request.POST.get('username', None)
	      password = request.POST.get('password', None)

        return HttpResponse("로그인 성공!")
    elif request.method == 'GET':
        return render(request, 'user/signin.html')
  • view의 로그인 작업 마무리하기(2)
    • 조건문을 통해서 요청 메서드가 POST인지 검사
    • username과 password를 받아서 패스워드를 검사
  • view의 로그인 작업 마무리하기(3)
    • UserModel을 사용해서 사용자를 불러오기
    • user앱의 views.py에 있는 sign_in_view 함수를 아래와 같이 추가
# user/views.py
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')

03.  User모델 업그레이드 하기


1) user앱의 models.py

  • 아래 내용을 응용해서, 장고의 유저 모델 + 우리의 모델 작업하기

기존)

# user/models.py
from django.db import models


# Create your models here.
class UserModel(models.Model):

    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)

업그레이드)

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


# Create your models here.
class UserModel(AbstractUser): # 수정 부분

    class Meta:
        db_table = "my_user" # 여기는 테이블 이름이에요! 꼭 기억 해 주세요!

    bio = models.TextField(max_length=500, blank=True)
  • 처음 만든 mySpartaSns라는 앱에 우리가 auth_user 모델을 바꾸었다고 알려주기
  • mySpartaSns앱의 settings.py에 추가하기
# mySpartaSns/settings.py
AUTH_USER_MODEL = 'user.UserModel'
  • Django에게 기본 인증과정 (AUTH_USER_MODEL)을 user앱에 작성한 UserModel로 사용하겠다! 라고 알려주는 과정

04.  User모델을 데이터베이스에 적용시키기


1) makemigrations 와 migrate

터미널을 클릭 해 주고, 아래와 같은 명령어를 순서대로 입력

python manage.py makemigrations 
python manage.py migrate

 

728x90
반응형