회원관리를 도맡을 새로운 앱을 생성했다.
바로 accounts 되시겠다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'map.apps.MapConfig',
'blog.apps.BlogConfig',
'accounts.apps.AccountsConfig', # 앱 추가했다.
]
다른 앱들과 마찬가지로 accounts 또한 urls.py 파일을 따로 만들어 거기에 url을 만들어주었다.
urlpatterns = [
path('admin/', admin.site.urls),
path('map/', include('map.urls')),
path('blog/', include('blog.urls')),
path('accounts/', include('accounts.urls')), # accounts.urls 추가
]
django에서 제공해주는 auth 모델을 사용했다.
<div>
<h1>회원가입</h1>
<form action="{% url 'signup' %}" method="POST">
{% csrf_token %}
Username: <input type="text" name="username" id="">
<br>
Password: <input type="password" name="password1" id="">
<br>
Confirm Password: <input type="password" name="password2" id="">
<br>
<!-- <input type="hidden" name="path" value={{request.path}}> -->
<input type="submit" value="sign up">
</form>
</div>
아이디(username), 비밀번호, 비밀번호 확인을 받아 회원가입을 한다.
<input>
의 name이 매우 중요하다. 저 name으로 뷰에서 해당 값을 받아올것이기 때문이다.
from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth.models import User # 장고가 주는 User 모델
from django.contrib import auth
필요한 것들을 import 해준다.
물론 뷰를 작성하면서 필요할 때마다 import 해온 것이지만..
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('login')
return render(request, 'signup.html')
return render(request, 'signup.html')
password1은 html에서 비밀번호 <input>
의 name이었다.
password2는 html에서 비밀번호 <input>
의 name이었다.
따라서,
만약 password1 == password2, 즉 비밀번호와 비밀번호 확인의 값이 일치하면,
👉🏻 (django가 제공하는) User 모델에 사용자의 username, password 값을 갖는 Objects를 만든다.
👉🏻 로그인 성공
👉🏻 이전페이지로 redirect 한다. (아직 이 부분을 해결하지 못해서.. 임시방편으로 login 페이지를 redirect 해주었다 ㅜㅜ)
일치하지 않으면, 그냥 회원가입 페이지를 render한다.
from django.urls import path
from . import views as accounts
역시 필요한 것들을 import 해주고
urlpatterns = [
path('signup/', accounts.signup, name="signup"),
]
회원가입 뷰를 위한 url를 만들어준다.
사용자로부터 받은 username과 password가 User에 있는지 확인한다.
<div>
{% if error %}
{{ error }}
{% endif %}
<!-- 로그인 실패했을 때 띄울 메시지 -->
<h1>로그인</h1>
<form action="{% url 'login' %}" method="POST">
{% csrf_token %}
Username: <input type="text" name="username" id="">
<br>
Password: <input type="password" name="password" id="">
<br>
<input type="submit" value="login" id="">
</form>
<a href="{% url 'signup'%}">회원가입 고!</a>
</div>
사용자로부터 username과 password를 받는다.
마찬가지로 <input>
의 name을 이용해 받을 예정이니, name을 잘 기억한다.
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 HttpResponseRedirect('/blog/')
else:
return render(request, 'login.html', {'error':'username or password is incorrect'})
# 로그인 실패시 'username or password is incorrect' 메시지를 띄움
else:
return render(request, 'login.html')
사용자로부터 username과 password를 받아 해당 유저가 모델에 있는 유저인지 확인한다.
만약 있으면(is Not None):
👉🏻 로그인하고 이전페이지로 redirect(이것 또한.. 일단은 그냥 홈으로.. 추후 이전페이지로 redirect 하도록 할 것임..)
없으면:
로그인 페이지를 render한다. 그리고 "아이디 혹은 비밀번호가 맞지 않는다"는 메시지를 출력한다.
(django에서 message라는 기능이 있었던 것 같은데, 나중에 사용하고자 한다. 일단은 저렇게 간단하게 구현)
urlpatterns = [
path('signup/', accounts.signup, name="signup"),
path('login/', accounts.login, name="login"),
로그인을 위한 url 추가했다.
url과 뷰만 있으면 된다.
def logout(request):
auth.logout(request)
return HttpResponseRedirect('/blog/')
초간단...
로그아웃 끝이다.
redirect는 (여기 또한) 임시로 지정한 상태이다.. 어쨌든 저렇게 로그아웃 함수 적고, redirect해 줄 주소를 적으면 된다.
urlpatterns = [
path('signup/', accounts.signup, name="signup"),
path('login/', accounts.login, name="login"),
path('logout/', accounts.logout, name="logout"),
]
로그아웃 url 추가 완료 !
로그아웃을 넣고 싶은 html 파일에 {% url 'logout' %}
으로 주솟값을 넣어 실행시켜주면 된다.
오늘 여기까지 했다.
여러가지 어렵고 힘든 일이 닥쳐도 꾸준히 꿋꿋이 하자! 💪🏻
열심히, 그리고 최선을 다하자. 후회없을 만큼!