Project using python/Cloning Airbnb
django login FBV
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 %}
참고 자료
- 노마드 코더의 Airbnb 클론 강의
- login
- file upload
- {% csrf_token %}
소스 코드
github.com/zpskek/airbnb-clone-v3/commit/87846809cce13a167d8e2305b4dcf3ad858ca845