오늘은 로그인과 회원가입 기능을 구현해볼건데요:>.
쟝고에서 제공하는 함수를 이용할 거에요.
1. 로그인 및 회원가입 기능을 구현할 app 및 화면 만들기
#터미널
python manage.py startapp accounts
-
#project/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blogapp',
'profileapp',
'accounts'
]
-
#accounts/urls.py**
urlpatterns = [
path('signup/', views.signup, name='signup'),
path('login/', views.login, name='login'),
]
-
#project/urls.py
from django.urls import path,include
#project/urls.py
path('accounts/', include('accounts.urls')),
-
<!--accounts/templates/signup.html-->
<h1>Sign Up!</h1>
<form method="POST" action="{% url 'signup'%}">
{% csrf_token %}
Username:
<input name="username" type="text" value="">
Password:
<input name="password1" type="password" value="">
Confirm Password:
<input name="password2" type="password" value="">
<input type="submit" value="Sign Up!">
</form>
method를 POST로 하는 이유는 내 로그인 정보를 url에 보여주면 안되겠죵?:>
그래서 Get이 아닌 Post로 한 것입니당.!
-
<!--accounts/templates/login.html-->
<h1>Login</h1>
<form method="POST" action="{% url 'login'%}">
{%csrf_token%}
Username:
<input name="username" type="text" value="">
Password:
<input name="password" type="password" value="">
<input type="submit" value="Login">
</form>
2. 회원가입 기능
#views.py
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']: # password 1,2입력된 값이 같다면
# user 객체를 새로 생성
user = User.objects.create_user(
username=request.POST['username'], password=request.POST['password1'])
return redirect('/') #첫화면으로
return render(request, 'signup.html') #아닌 경우는 그저 페이지 보여주기
def login(request):
return render(request, 'login.html')
User.objects.create_user(username, password)
이는 User이라는 class의 객체의 목록을 불러와(쿼리셋)
create_user함수를 이용해 유저를 만듭니다.
create_user(*username_field*, password=None, **other_fields) 함수는
해당하는 파라미터 값을 넣으면 객체가 생성됩니다.
이때 User라는 클래스라는 모델은 AbstractUser 클래스를 상속받아 정의된 모델인데,
이를 통해 상속받는 것들을 포함하여 여러 필드를 가지고 있습니다.
필수사항인 username과 password이외에도
first_name,last_name,email,groups,user_permissions,is_staff 등이 있습니다.
이때 사용자 인증이라는 기능에 대해 아셔야합니다.
이는 사용자정보를 데이터베이스에 저장하고, 저장된 데이터를 구분할 수 있는 유일한(누구와도 중복되지 않는) 키(key)를 지정해서 사용자를 식별(구별)하는 기능입니다. 그래서 가입할 때 핵심기능은 사용자를 구분할 수 있는 키를 사용자로부터 얻어오고 이것이 중복되지 않도록 하는 것입니다. 이때 username이 식별하는 역할 하고 있습니다.
(unique=True라고 되었죠?:>)
그렇기때문에 username을 중복되게 가입할 경우, 오류가 나게 됩니다.
3. 로그인 기능
def login(request):
if request.method == 'POST':
# login.html에서 넘어온 username과 password를 각 변수에 저장하기.
username = request.POST['username']
password = request.POST['password']
# 해당 username과 password와 일치하는 user 객체를 가져온다.
user = auth.authenticate(request, username=username, password=password)
# 해당 user 객체가 존재한다면(객체가 존재하지 않는다면 none을 반환할 텐데, none이 not이니까 존재한다면!)
if user is not None:
auth.login(request, user)
return redirect('/')
else:
return render(request, 'login.html', {'error': 'username or password is incorrect.'})
else:
return render(request, 'login.html')
auth는 쟝고에서 제공해주는 패키지로 로그인, 로그아웃 등 인증 관련 함수들을 가지고 있습니다.
user = auth.authenticate(request, username=username, password=password) 에서
authenticate함수는 self, username, password를 인자로 받은 후,
정상적으로 인증된 경우 user 객체를 ‘하나’ 반환해야 하고,
없는 경우 None값을 반환해야 합니다.
즉, 데이터베이스에서 전달받은 username과 password로 사용자가 존재하는지 판단합니다.
auth.login(request,user)를 통해
세션에 로그인 정보를 생성 & 저장 시킬 수 있습니다.
세션이란, 웹 서버에서 임시로 클라이언트의 데이터를 가지고 있는 것을 뜻합니다.
쿠키와 비슷한 역할이나, 쿠키는 클라이언트 측에 데이터를 가지고 있는 반면에,
세션은 서버측에 데이터를 갈무리한다는 차이점이 있는데요.
주로 로그인, 온라인 쇼핑몰의 장바구니 등에 사용되어집니다.
자세한 내용은 아래를 참고해주세요.
https://free-eunb.tistory.com/49
로그인의 경우, 페이지를 이동하더라도 유지되어야 하는데,
이 세션을 이용하여 페이지가 이동하더라도 유지되도록 할 수 있게 되는겁니다.
#login.html -> 로그인이 안될 경우 에러메세지 출력하도록
{% if error %}
{{ error }}
<br>
<br>
{% endif %}
4. main.html
로그인 되었을 때와 아닐때 뜨는 화면이 다르게 하기.
{% if user.is_authenticated %} #로그인이 되어있는지 물어봄
<a>환영합니다. {{ user.username }} 님!</a>
<a href="{% url 'new' %}">글쓰기</a>
{% else %}
<a href="{% url 'signup' %}">Signup</a>
<a href="{% url 'login' %}">Login</a>
{% endif %}
Django는 기본적으로 user 모델을 갖고 있으며,
템플릿 변수로 사용하는 것이 가능합니다.
이를 통해 해당 객체의 username을 갖고 올 수 있음.
5. logout
<a href="{% url 'logout' %}">Logout</a>
이렇게만 하면 로그인한 사람이 로그아웃을 했는지를 확인할 수 없기 때문에
POST방식으로, csrf_token도 같이 전송해야 합니다.
a 태그로만 method를 보앨 수 없어 form 태그로 바꾸어 주었습니다.
<form method="POST" action="{% url 'logout' %}">
{% csrf_token %}
<input type="submit" value="로그아웃">
</form>
-
def logout(request):
if request.method == 'POST':
auth.logout(request)
return redirect('/')
return render(request, 'signup.html')
'개발 > Django_python 웹 프레임워크' 카테고리의 다른 글
로그인, 회원가입 3 -User Model 확장 / OneToOneField 사용 (0) | 2020.07.21 |
---|---|
로그인, 회원가입 2 -Blog Model - User Model 연동, 1:N (1) | 2020.07.20 |
Django 구동원리 : MTV (0) | 2020.07.19 |
Django project 4 - url 관리 (0) | 2020.07.16 |
Django 템플릿관리, 상속 (0) | 2020.07.16 |
댓글