Development/Django(멋쟁이사자처럼 7기 운영진)

[멋사7기] 5주차 - 1, 2. 로그인, 회원가입 이론, 실습

안다희 2019. 2. 9. 20:46
728x90

https://coding-dahee.tistory.com/63 오류


장고에서 제공하는 함수 이용!


http method


왜 정보를 주고 받는데에 method를 나누냐?


get : 데이터 조회, 데이터가 url에 뜬다


post : 데이터 생성, 노출 x


put : 데이터 수정


delete : 데이터 삭제


================

실습


blogproject에서 진행함.


1) accounts라는 앱 만들기

python manage.py startapp accounts


2) project의 settings.py에서

INSTALLED_APPS = [
'accounts.apps.AccountsConfig',


3) app 안에 templates 폴더 만들어주고


4) 그 안에 login.html, signup.html 만들기


5) login.html

{% extends 'base.html' %}

{% block contents %}

<div class="container">
<h2>Login!</h2>
<form action="">
Username : <input type="text" name="username">
<br>
Password : <input type="password" name="password">
<br>
<input type="submit" value="Login">

</form>
</div>

{% endblock %}


6) signup.html

{% extends 'base.html' %}

{% block contents %}

<div class="container">
<h2>Sign Up!</h2>
<form action="">
Username : <input type="text" name="username">
<br>
Password : <input type="password" name="password1">
<br>
Confirm Password : <input type="password" name="password2">
<br>
<input type="submit" value="Sign Up">

</form>
</div>

{% endblock %}


7) accouts 앱 안의 urls.py

from django.contrib import admin
from django.urls import path
from . import views

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


8) project의 urls.py

path('accounts/', include('accounts.urls')),


9) accounts 앱 안의 views.py

def signup(request):
return render(request, 'signup.html')

def login(request):
return render(request, 'login.html')


9) 이제 base.html 의 navbar에 url 연결해주기


여기에 url 연결해주기

<a class="dropdown-item" href="{% url 'signup' %}">회원가입</a>
<a class="dropdown-item" href="{% url 'login' %}">로그인</a>

했던거니까 알지?


10) signup.html 수정

<form action="{% url 'signup' %}" method="POST">
{% csrf_token %} <!-- for 보안 -->


11) signup 함수 수정 in views.py in accounts

계정생성해주는 코드 써줘야겠지

from django.contrib.auth.models import User
from django.contrib import auth

def signup(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'])
auth.login(request, user)
return redirect('blog')
return render(request, 'signup.html')



***************

redirect 할 때

from django.shortcuts import render, redirect

***************

꼭 import 해주기~



12) login.html 수정

<form action="{% url 'login' %}" method="POST">
{% csrf_token %} <!-- csrf 공격 방어하는 수단 for 보안 -->


13) login 함수 수정 in views.py in accounts

def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']

user = auth.authenticate(request, username=username, password=password)
if user is not None:
auth.login(request, user)
return redirect('home')
else:
return render(request, 'login.html', {'error': 'username or password is incorrect.'})
else:
return render(request, 'login.html')



14) 로그아웃 기능도 구현해보자 views.py in accounts

def logout(request):
if request.method == 'POST':
auth.logout(request)
return redirect('home')
return render(request, 'login.html')


15) urls.py in accounts

path('logout/', views.logout, name="logout"),


16) base.html에 url도 연결~

<a class="dropdown-item" href="javascript:{document.getElementById('logout').submit()}">로그아웃</a>
<form id="logout" method="POST" action="{% url 'logout' %}">
{% csrf_token %} <input type="hidden" />
</form>

post방식으로 보내줘야해서 이렇게 야매로


17) 그리고 회원가입하고 admin 가보면 User가 있음


=============================

로그인, 회원가입 완료!


18) 로그인하면 로그인은 안보여야 정상!

{% if user.is_authenticated %}
{{user.username}}
{% else %}
Dropdown
{% endif %}

이런식으로 응용해주면 됨~




출처: https://mingos-habitat.tistory.com/34 [밍고의서식지:티스토리]