본문 바로가기

내배캠/TIL

TIL/18/20230405

728x90

파이썬 장고 실무 기초(3)


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

* GET 과 POST 활용하기

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 ""

 

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에 데이터를 보내주는 역할을 한다. 
* {% csrf_token %} 은, Django에서 post 할 때에 보안을 위해서 사용 해 주어야 합니다. post 메서드를 만들때 자주 사용 할 예정이니 명심!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로 이동 하게 해 준다. 

 


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

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">
<!-- 아랫 부분 생략 -->

 

 

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')

 


User모델 업그레이드 하기

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로 사용하겠다! 라고 알려주는 과정

 


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

makemigrations 와 migrate

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

python manage.py makemigrations 
python manage.py migrate

 


개인과제가 시작되었는데... 이미 꺾였어... 그래도 한번 해볼게...!

728x90

'내배캠 > TIL' 카테고리의 다른 글

TIL/20/20230407  (0) 2023.04.07
TIL/19/20230406  (1) 2023.04.07
TIL/17/20230404(수정중)  (0) 2023.04.04
TIL/16/20230403  (4) 2023.04.03
TIL/15/20230331  (0) 2023.04.03