6. Django Logout / SignUp기능

LouAn Lee·2022년 5월 31일
0

지금까지 한 작업:
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. Logout, Signup 기능 만들기
.
.

Logout, Signup 기능 구현하기

logout

  • 아쥬 고맙게도 Django에는 로그인(login), 로그아웃(logout), 회원가입(signup)등의 기능이 이미 구현되어 있다. (= 기본적인 사항만 하고자 한다면 함수만 import해서 사용하면 된다.)
  • 위의 이미지를 참고하여 django가 request를 받았을 때 views의 어디로 보낼지를 알 수 있게 일단 urls에 urlpatterns를 등록하자.

urlpatterns = [
path(route, view, kwargs = None, name = None)
]

path안에는 route, view가 들어가고 kwargs나 name을 넣을 수 있다.

  • route는 myapp전에 project를 생성했을 때 생성된 my_project/urls.py에 등록된 route에 더해서 myapp에서 추가로 더할 url을 적어주면 된다. 예를 들어, /myapp/ 까지를 project urls.py에 등록하고, myapp/urls.py에 나머지 주소 예를 들어 /login/을 등록하면 localhost/myapp/login/에 접속(보통은 127.0.0.1:8000/myapp/login/)을 치면 urls는
    '아 myapp/login/에 해당하는 곳이구나 그렇다면 view는 뭘 봐야하지?'
  • 라고 했을때 두번째 view에 해당하는 녀석을 찾아 읽어올 것이다.

*kwargs는 https://brunch.co.kr/@princox/180 요기 잘 설명되어 있으니 참고.

from django.urls import path
from . import views

urlpatterns = [
    path('logout/', views.logout_view, name='logout'),
]
  • 그리고 뭔가를 처리해야하니 먼저 views.py에 함수를 만들어서 기능을 구현하자. html 페이지에서 logout 함수를 trigger할 button이나 href를 만들어놓고, views.py에 해당 기능을 구현하자.
from django.contrib.auth import logout

def logout_view(request):
    if request.method == "POST":
        logout(request)
    return render(request, "myapp/login.html")
  • 여기에서 한번쯤 생각해 봐야할 것은 logout시에 어디로 보낼 것이냐의 문제이다. logout을 하면 다시 login페이지로 보낼 것이냐. 메인화면으로 보낼 것이냐 등등에 따라 logout(request) 뒤에 return을 하고 보낼 곳을 적으면 된다. 여기에서는 login.html 안에 로그인이 되었을 경우와 되지 않았을 경우를 나누어서 한 페이지 안에 구현해 놓았으므로 그냥 login.html로 보내기로 한다.

- redirect vs render

  • 그럴 경우는 별로 없겠지만, 만약 외부의 사이트로보내겠다 하면 redirect(절대경로, ex)"https://www.naver.com")와 같이 사용하는 것도 가능하며, urls.py에 app_name을 지정하고 해당이름을 통해 접근하는 것도 가능하다. 예를 들어 app_name ="my_app" 그리고 urlpatterns에 path(name = "yoyo")로 한다면 redirect('my_app:yoyo')와 같이 사용하는 것도 가능하다.
  • 반면 render는 주어진 템플릿과 context를 결합하여 HttpResponse객체를 리턴한다.
    예를 들어, models.py에서 People이라는 클래스의 data를 사용하고자 한다면 아래처럼 작성하고 index.html에서 받아서 쓸 수 있다는 말씀
def index(request):
    latest_id_list = People.objects.order_by('-pub_date')[:5]
    template = loader.get_template('my_app/index.html')
    context = {
        'latest_id_list': latest_id_list,
    }
    return HttpResponse(template.render(context, request))
{% if latest_id_list %}
    <ul>
        <h1>Here is People list</h1>
    {% for people in latest_id_list %}
        <li>{{ people.people_name }}</li>
    {% endfor %}
    </ul>
{% else %}
    <p>No companies are registered.</p>
{% endif %}
  • 이렇게 logout을 하고 어디까지 보낼지 설정을 하고나면, login/logout기능이 완성되었다. 템플릿의 if else를 사용하여 login 이 되었을 때만 보여줄 페이지를 만들 수도 있을 것이고, 간단한 조합만으로 가능한 여러 방법을 생각해 볼 수 있다.

SignUp

이번에는 SignUp 기능을 만들어 보자.
기본적으로
1. signup 기능 등록 --> urlpatterns에 등록하고 views에 signup_view 만들기
2. id/pw/pw확인을 받아서 database에 입력 --> 기본 내장되어 있는 회원관리 기능사용
3. 회원가입 완료 후 어디론가 보내기
정도의 과정이 진행될 것이다. my_app/urls.py에 sign_up경로와 view를 등록하자

urlpatterns = [
path('login/', views.login_view, name='login'),
path('signup/', views.signup_view, name='signup')
]
  • 먼저 html에서 username, password1, password2(pw1확인용)을 받아서 확인하는 기능을 만들도록 하자. django에 내장된 새로운 유저를 만드는 메소드는 User.objects.create_user(username, password) 이다. 이를 user로 받아서 로그인을 시키고 다시 login page로 보내도록 하겠다. 그러면 login page에서는 login된 유저를 발견하고 반가워해 줄 것이다. 만약 처음 회원가입 페이지에 진입했다면(request.method != "POST"라면) else부분을 실행시켜 "my_app/signup.html"을 보여줄 것이다.
def signup_view(request):
    if request.method == "POST":
       if request.POST['password1'] == request.POST['password2']:
           user = User.objects.create_user(
                username=request.POST['username'],
                password=request.POST['password1']
            )
           login(request, user)
           return redirect('login')
    else:
    	return render(request, "my_app/signup.html")
  • 다음으로 입력을 받을 html 화면을 구현한다. 만약 user가 이미 로그인 중이라면(user.is_authenticated가 true라면) 이미 로그인이 되어 있습니다!와 logout 버튼을 보여주고 아니라면 회원가입 영역을 보여줄 것이다.
    form tag의 action에 url의 'signup'임을 지정하면 urls에서 어디 view로 보내야할지 인식하고 관련 view를 가져올 것이다. 여기서는 위에 구현한 signup이 불려오고 submit을 누르면 관련된 input을 POST방식으로 보낼것이며, 보안을 위해 csrf_token을 사용할 것이다.
<head>
    <meta charset="UTF-8">
    <title>회원가입 페이지</title>
</head>
<body>
{% if user.is_authenticated %}
    이미 로그인이 되어 있습니다!
    <form action ="{% url 'logout' %}" method = "POST">
        {% csrf_token %}
        {{ user.username }} 님 환영합니다. <input type = "submit" value = "로그아웃">
    </form>
{%  else %}
    회원가입 페이지
    <form action = "{% url 'signup' %}" method="POST">
        {% csrf_token %}
        username:<input name = "username" type = "text">
        <br>
        password:<input name = "password1" type = "password">
        <br>
        password 확인:<input name = "password2" type = "password">
        <br>
        <input type = "submit" value = "회원가입">
    </form>
{% endif %}
</body>
</html>

profile
데이터 사이언스

0개의 댓글