본문 바로가기

Study/django

django 기초 - bootstrap을 이용한 사이트 만들기 : 3. 로그인 페이지 만들기

1. 로그인창 연결하기

 - 먼저 간단하게 urls - views - html을 정의해준다.

# views.py
def index(request):
    # return render(request, 'bbs/home.html')
    return render(request, 'bbs/login.html')

 - 첫번째 창을 불러오는 index함수를 수정하였다.

 - 처음 bbs app에 접속하게 되면, login html이 연결되도록 하였다. 

 - login html의 경우 header와 footer의 include가 필요없다. 따라서 {% load static %}만 해준다.

 - 등록된 아이디와 비밀번호를 입력하고 sign in을 누르면 home 페이지로 이동해야할 것이다.

 - urls 와 views, html에 추가적인 작업이 필요하다.

# urls.py 
urlpatterns = [
    path('main/', views.index, name='main'),
    path('list/', views.list, name='list'),
    path('login/', views.login, name='login'),
]

# login.html
# <form action="{% url 'login' %}" method="post">
#  {% csrf_token %}
#  ....... 
#   <input type="text" name="id" class="form-control" placeholder="USER ID"/>
#   <input type="password" name="pwd" class="form-control" placeholder="Password"/>

# views.py
def login(request):
    if request.method == 'POST':
        id = request.POST['id']
        pwd = request.POST['pwd']
        user = BbsUser.objects.get(user_id=id, user_pwd=pwd)
        print('------ user param : ', id)
        context = {}
        if user is not None:
            request.session['user_name'] = user.user_name
            request.session['user_id'] = user.user_id

            context['session_user_name'] = request.session['user_name']
            context['session_user_id'] = request.session['user_id']

    return render(request, 'bbs/home.html', context)

- 먼저 urls에 login/을 등록한다.

 - login.html -> form -> action -> 등록된 url을 템플릿 메서드로 지정하고, post방식으로 데이터를 전송한다.

 - post 방식이기에 장고에서는 {% csrf_token %} 가 필수적으로 붙는다. 

 - 아이디는 name ='id' , 비밀번호는 name='pwd'로 데이터가 전송된다.

 

 - views에서는 다음 요청을 처리한다.

 - 1. 넘겨받은 데이터에서 name으로 각 변수를 지정한다. 

 - 2. 정보를 통해 매핑된 model 의 클래스로부터 정보를 가져온다.

    -> sql의 select *   from BbsUser  where user_id = id and user_pwd =pwd 와 같다.

 - 3. 넘겨받은 정보가 있다면 (데이터베이스에 해당 사용자 정보가 있다면)

 - 세션에 사용자 정보를 저장하고, context에 세션에 저장된 사용자 정보를 저장한다.

 - render를 통해 로그인된 화면 (홈 화면)을 연결시켜준다.

 

 # 세션에 데이터를 담는 이유

 - http (web)의 특성상 내가 로그인 후 사이트 내 다른 사이트로 redirect하는 경우 context에 담긴 내 로그인정보가 사라진다.

 - 이를 방지하기 위해 일반적으로 쿠키 혹은 세션을 이용하여 사용자의 정보를 유지하는 트래킹 매커니즘을 사용한다.

 - 즉, 지금까지의 render(request, 'xxxx.html', context)는 context정보를 xxxx.html 까지만 전송하고, 그다음 정보는 보장하지 않는다.

 - 따라서 session을 통해 전해진 데이터를 길게 유지할 수 있다. timeout이 적용되는데, 기본값은 일반적으로  30분이다.

 - logout을 구현하기 위해서는 session을 clear 해 주어야 하고, 다시 login.html로 돌아가야한다.