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 %}
이런식으로 응용해주면 됨~