<오늘 한 일>
- 페어 프로그래밍(pair programing) Day3
- 장고 기초 3주차, 4주차, 5주차
- 개인과제 하려고 급하게 쭈르륵 다 듣기는 했는데 정리는 못 했다
- 대신 개인과제에 3~5주차에 배운 기능들을 넣었다
- 전부는 아니고...회원가입, 로그인, 로그아웃 기능...
- 장고 개인 과제
회원가입 기능 구현하기
- urls.py - views.py - signup.html 작성 후 연결하기
# accounts/urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = "accounts"
urlpatterns = [
# 회원가입 페이지 주소를 /sign-up으로 부여, 기본주소/sign-up 접속 시 sign_up_view 함수 실행됨
path('sign-up/', views.sign_up_view, name='sign-up'),
]
# accounts/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import get_user_model # 사용자가 데이터베이스 안에 있는지 검사하는 함수
from django.contrib import auth
import re
# Create your views here.
def sign_up_view(request):
if request.method == 'GET': # 겟 요청인 경우
user = request.user.is_authenticated
if user: # 이미 로그인한 사용자가 회원가입창에 들어온 경우
return redirect('/') # 홈으로 이동
else: # 비로그인 상태인 경우 회원가입 창 띄워줌
return render(request, 'accounts/signup.html')
elif request.method == 'POST': # 포스트 요청인 경우
username = request.POST.get('username', '')
password = request.POST.get('password', '')
password2 = request.POST.get('password2', '')
email = request.POST.get('email', '')
if password != password2:
# 비밀번호가 같지 않은 경우 경고창
return render(request, 'accounts/signup.html', {'error': '비밀번호를 확인해 주세요!'})
else:
if username == '' or password == '':
# 이름이나 비밀번호가 빈칸인 경우 경고창
return render(request, 'accounts/signup.html', {'error': '사용자 이름과 비밀번호는 필수 값 입니다'})
exist_user = get_user_model().objects.filter(username=username)
if exist_user:
# 이미 가입한 유저의 이름과 같은 경우 경고창
return render(request, 'accounts/signup.html', {'error': '사용자가 존재합니다'})
regex_email = '([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+'
if not re.fullmatch(regex_email, email):
# 이메일 형식이 아닌 경우 경고창
return render(request, 'accounts/signup.html', {'error': '올바른 이메일 형식이 아닙니다'})
else:
User.objects.create_user(
username=username, password=password, email=email) # 회원가입 정보를 User모델에 저장
return redirect('/login') # 회원가입이 완료되면 로그인 페이지로 이동
# accounts/signup.html
# form 태그 부분
<form class="form-area" method="post" action="/sign-up/">
# 폼 태그 내에 typy="submit"인 버튼을 누르면 '기본주소/sign-up'로 post 요청이 전송됨
{% csrf_token %} # 장고에서 제공하는 보안 기능
# 경고창 위치: 이름, 비밀번호, 비밀번호 확인, 이메일 작성 부분과 회원가입 버튼 사이
{% if error %} # 뭔가 에러가 나는 경우
<div class="alert alert-danger" role="alert">
{{ error }} # 에러 메시지를 띄운다
</div>
{% endif %}
로그인 기능 구현하기
- 장고에 이미 로그인 기능이 있다고 하는데 원하는 경고창까지 쓰려면 어떻게 해야 할지 잘 모르겠어서 장고 기초 강의에서 배운대로 구현했다
- urls.py - views.py - login.html 작성 후 연결하기
# accounts/urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = "accounts"
urlpatterns = [
# 로그인 페이지 주소를 /login으로 부여, 기본주소/login 접속 시 login_view 함수 실행됨
path('login/', views.login_view, name='login'),
path('sign-up/', views.sign_up_view, name='sign-up'),
]
# accounts/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib import auth
def login_view(request):
if request.method == 'POST': # 포스트 요청인 경우
username = request.POST.get('username', '')
password = request.POST.get('password', '')
# 입력된 정보가 유효한 유저 정보인지 확인
me = auth.authenticate(request, username=username, password=password)
if me is not None: # 입력된 정보가 유효한 경우
auth.login(request, me) # 로그인 성공
return redirect('/') # 홈으로 이동
else: # 입력된 정보가 유효하지 않는 경우 경고창 띄움
return render(request, 'accounts/login.html', {'error': '이름 혹은 비밀번호를 확인해 주세요!'})
elif request.method == 'GET': # 겟 요청인 경우
user = request.user.is_authenticated
if user: # 로그인한 사용자가 로그인 페이지에 접속한 경우
return redirect('/') # 홈으로 이동
else: # 비로그인 상태인 경우 로그인 페이지 띄움
return render(request, 'accounts/login.html')
- 회원가입 함수가 있는 views.py 파일 안에 같이 있는 거라 실제 파일에는 위에 import랑 똑같은데 로그인 함수 실행에 필요한 import만 추려보았음
# accounts/login.html
# 폼 태그 부분
<form class="form-area" method="post" action="/login/">
{% csrf_token %}
# 경고창 위치: 이름, 비밀번호 적는 칸과 로그인 버튼 사이
{% if error %} # 에러가 나면
<div class="alert alert-danger" role="alert">
{{ error }} # 에러 메시지를 띄움
</div>
{% endif %}
로그아웃 기능 구현하기
- 장고 기본 기능 사용으로 urls.py와 html 파일만 작성 후 연결함
# accounts/urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = "accounts"
urlpatterns = [
path('login/', views.login_view, name='login'),
# 로그아웃 페이지 주소를 /logout으로 부여, 기본주소/logout 접속 시 장고 기본 로그아웃 함수 실행됨
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
path('sign-up/', views.sign_up_view, name='sign-up'),
]
# base.html
# nav바가 있는 html 파일임
<li class="nav-item active">
# 로그아웃 버튼을 누르면 '기본주소/logout'로 이동함
<a class="nav-link" href="/logout"> 로그아웃</a>
</li>
<오늘 새롭게 배운 것>
- 문법
- swapcase(): 대문자를 소문자로, 소문자를 대문자로 바꿔줌(여기에 내용 추가함)
- 인덱스 바꾸기 글에 다른 사람 풀이...
- 변수에 값을 넣을 때 ,(컴마)를 이용하면 값을 바꿔서 넣을 수 있다는 점...
- 예시
a = "안녕하세요"
b = "사람입니다"
a, b = b, a
print(a)
print(b)
# 출력화면
# 사람입니다
# 안녕하세요
- 장고 기초 강의
- 할 때마다 새로워서 매번 다시 배우는 느낌이다
- 정리하기 어려움...ㅠ
<느낀 점>
- 하.....과제 미쳤다....
- 못하겠다......
<내일 목표>
- 과제....상품 등록...?
- 하...........
- 과제....50% 하고 제출...?