Cog Factory 2021. 3. 2. 07:04

url 설정

config/urls.py

urlpatterns = [
    path("users", include("users.urls", namespace="users")),
]

users/urls.py

from django.urls import path
from . import views

app_name = "users"

urlpatterns = [path("login/", views.loginView, name="login")]

{% url %}

  url template tag를 이용해서 signup page로 갈 수 있게 한다. {% url 'users:login' %}은 /users/login과 같다.

FBV(Function Based View)

users/views.py

  FBV에서는 if 문으로 GET method 요청이 왔을 때와 POST method 요청이 왔을 때를 구분한다. GET은 page를 보여주고 POST는 client로부터 온 data를 처리한다.

  authenticate는 username과 password가 일치할 때 user를 반환하고 그렇지 않으면 None을 반환한다.

from django.shortcuts import render, redirect, reverse
from django.contrib.auth import authenticate, login

def loginView(request):
    if request.method == "GET":
        return render(request, "pages/users/login.html")
    elif request.method == "POST":
        email = request.POST.get("email")
        password = request.POST.get("password")
        user = authenticate(request, username=email, password=password)
        if user is None:
            return redirect(reverse("users:login"))
        login(request, user)
        return redirect(reverse("core:home"))

templates

pages/users/signup.html

  <form> tag에 enctype="multipart/form-data" attribute가 있다. django가 file을 업로드할 때 사용하는 속성이다. views.py에서는 request.FILES.get()으로 업로드하는 file에 접근할 수 있다.

  {% csrf_token %}은 csrf 공격을 막기 위한 token이다. django는 보안이 뛰어나기 때문에 {% csrf_token %} tag를 사용하지 않으면 submit이 안 된다. csrf 공격의 보안은 절대 client를 신뢰하지 않는 것으로 시작한다. 즉, 이 token 값을 가지지 않은 브라우저 요청은 받아들이지 않는다.

{% extends 'base.html' %}

{% block page_title %}
  Login
{% endblock page_title %}

{% block search-bar %}
<div></div>
{% endblock search-bar %}

{% block content %}
  <div class="background">
    <div class="wrap">
      <form action="{% url 'users:login' %}" method="post" class="form">
        {% csrf_token %}
        <div class="form_input rounded-tl-lg rounded-tr-lg">
          <input type="email" name="email" placeholder="Email" required class="w-full" maxlength="254" id="id_email">
        </div>
        <div class="form_input rounded-bl-lg rounded-br-lg">
          <input type="password" name="password" placeholder="Password" required id="id_password">
        </div>
        <button class="form_button">Submit</button>
      </form>
      
    </div>
  </div>
{% endblock content %}
  

참고 자료

소스 코드

github.com/zpskek/airbnb-clone-v3/commit/87846809cce13a167d8e2305b4dcf3ad858ca845