5. 웹페이지를 만드는 플로우 + 회원가입 및 login 기능

LouAn Lee·2022년 5월 25일
0

머리가 나빠 개인적으로 정리하기 위해 적어둡니다. 틀린 부분이 있을 건데, 나름대로 이해한대로 적고자 합니다. 틀린 부분은 지적해주시고 도움이 되었다면 기쁘겠네요.

먼저 이 블로그는 Django로 어떤 일련의 회사들을 평가하기 위한 웹사이트를 만드는 과정을 기록한 글이다. 이를 통해서 사람들이 자신들의 경험을 공유하고, 돈과 시간과 정신적 에너지를 낭비하며 내상을 입게되는 상황을 피하게 되길 기대하는 마음에서 만들고 있다.

처음부터 시작하면 좋겠는데, Django를 공부하다보니 간단치 않아 정리하는 것이 좋겠다는 생각이 들어 중간에 시작하게 되었다. 따라서, 앞의 세팅하는 부분은 앞으로 시간이 날 때 정리하도록 하고 지금은 먼저 중간부터 앞으로 나가기로 한다.

지금 까지는:
0. (내가 이해한) Django의 기본 개념
1. Macbook air M1에 개발환경 setting(Django, Python설치)
2. Django 기본 프레임웍 익히기
3. localhost page에 "hello world"출력
4. Django admin page 및 DB 연동 + DB data web page에 보여주기
정도가 진행되었으며, 이번 페이지에서는
5. 웹페이지 만드는 플로우 + 회원가입 및 log in 기능 구현
6. Login, Logout, Signup page 만들기
7. test data 삽입 후 front page 꾸미기를 진행해볼 예정
.
.

Django의 웹페이지는 대략 다음의 순서를 따른다.

모델 설계(myapp/models.py)
→ View 만들기(myapp/views.py)
→ template 만들기(template/myapp/화면이름.html)
→ URL만들기(myapp/urls.py)

  • (여기서 특정 view가 DB의 데이터를 필요(1번)로 하지 않거나 html페이지를 필요(3번)로 하지 않을 경우엔 해당 과정이 생략되기도 한다.)
  • 위 과정은 때론 앞뒤로 왔다갔다 하면서 만들기도 한다. 다만 이러한 과정이 포함되어 있다고 생각하면 된다.

1. 모델(model, Database) 설계

  • 웹페이지에서 사용할 데이터의 종류와 데이터 베이스의 setting을 생각해서 project(app)/models.py에 class 형태로 넣는다. 이 프로젝트에서 user내의 입력 항목을 customize해서 사용할 경우 이 과정에서 할 일이 있으나 지금은 기본적인 것만 사용하기로 한다. 이미 만들어둔 admin page에서 테스트를 위해서 superuser를 만들자.
> python manage.py createsuperuser
  • Username과 email, password를 차례로 묻는데 적어주고나면 admin page에 접속 가능한 모든 권한이 있는 superuser가 생성된다. id/pw를 잘 기억해뒀다가 로컬호스트/admin/에 접속하여 로그인을 하고 test용 유저하나를 만들어보자.

  • 다음으로 makemigration 명령어를 통해서 models.py의 변경사항을 반영하는 새로운 migration을 만든다.
> python manage.py makemigration
* migration: DB에 반영할 사항을 저장한다고 생각하면 편함

  • 다음으로 아래 명령어를 통해 변경사항을 실제 DB에 반영한다
> python manage.py migration

2. View 만들기

  • View는 파이썬에서 처리할 기능이나 계산을 처리하는 부분이다. def의 형태로 하고싶은 기능을 막 구현해놓고 문자열, html 등을 return할 수 있다.(이 리턴한 부분이 화면에 뿌려진다) 아래 예제에서는 views에 index를 만들어 놓았고, index함수가 call 되면 myapp/login.html이라는 파일을 불러와 화면에 뿌려줄 것이다.
from django.contrib.auth import authenticate, login

def login_view(request):
    if request.method == "POST":
        username = request.POST["username"]
        password = request.POST["password"]
        user = authenticate(username = username, password = password)
        if user is not None:
            print("인증성공")
            login(request, user)
        else:
            print("인증실패")
    return render(request, "myapp/login.html")
  • django.contrib.auth아래의 authenticate()는 username과 password가 일치할 경우 user객체를 반환하며, 아닐 경우 None을 반환한다. 따라서 None이 반환되었을 경우 인증 실패로 간주. None이 아닐 경우 login function을 실행시켜 django에게 login이 된 상태임을 알려준다.

  • 뒤에 login을 위한 html 껍데기를 만들기로 하고, 그 껍데기에서 입력한 username(id)와 password를 받아서 실제 db의 자료와 대조하는 기능을 구현해 놓았다. 인증에 성공할 경우 django내에서 login 상태로 변경하며, 실패할 경우 "인증실패"라고 console에 print해주는 간단한 기능이다.

3. template 만들기(html 만들기)

  • 이 과정에서는 myapp아래 views의 def(펑션)에서 render할 때 사용할 html 파일을 만드는 과정이다. 기본적으로 html이기는 하지만 변수를 받아오거나 간단한 if문 loop문을 위해 추가적으로 사용하는 간단한 template 언어가 존재한다.

    아래 django에서 사용하는 template언어에 대한 설명이 나와 있으니 참고하면 좋다.
    https://goodthings4me.tistory.com/92
    만약 좀 더 자세한 사항을 알고 싶으면 아래 url로.
    https://docs.djangoproject.com/en/4.0/ref/templates/language/

  • 이제 html 파일을 만들면 파이참은 아래와 같이 텅빈 페이지를 만들어 준다.

<!DOCTYPE html>
<html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>title</title>

  </head>
  <body>

  </body>
</html>
  • 꾸미기는 나중에 하기로 하고 간단히 뭔가 로그인이 될 것 만같은 껍데기를 만들기 위해 아래와 같은 코드를 추가해주자
<!DOCTYPE html>
<html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>로그인 page 입니다.</title>

  </head>
  <body>
	{% if user.is_authenticated %}
      로그인 성공!
      {{ user.username }} 님 환영합니다.
	{%  else %}
      <form action = "" method="POST">
          {% csrf_token %}
          <input name = "username" type = "text">
          <input name = "password" type = "password">
          <input type = "submit" value = "로그인">
      </form>
	{% endif %}
  </body>
</html>
  • {% if % } 는 django template에서 사용하는 if문이며 {% elif %}, {% else %}와 함께 쓰이고 {% endif % }로 마무리 한다. 여기서는 user객체 아래 is_authenticated가 true일 경우 로그인 성공!을 반환하고 user.username에게 환영의 메시지를 보낸다. 그리고 로그인이 되지 않았을 경우 log in을 위한 페이지가 로드되게끔 만들어졌다.

  • { % csrf_token % }은 site에서 django로 http요청을 보내는 경우 인증을 위해 사용하는 토큰으로 <form 태그>로 감싸서 사용한다. django는 유효한 요청일 경우 요청을 처리하고 유효하지 않을 경우 403 Forbidden Response를 반환한다.

profile
데이터 사이언스

0개의 댓글