먼저 이 블로그는 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 꾸미기를 진행해볼 예정
.
.
모델 설계(myapp/models.py)
→ View 만들기(myapp/views.py)
→ template 만들기(template/myapp/화면이름.html)
→ URL만들기(myapp/urls.py)
1. 모델(model, Database) 설계
> python manage.py createsuperuser
> python manage.py makemigration
> python manage.py migration
2. View 만들기
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를 반환한다.