본문 바로가기
스파르타코딩 AI웹개발 3기

내일배움캠프_TIL_2022.10.24

by 청귤에이드 2022. 10. 24.

장고 거북이반 강의 복습하면서 놓치기 쉬워 다시 한 번 검토가 필요한 내용들 중심으로 정리해보았습니다.

 

1. template 파일에서

<form method="POST" action="{% url 'user:login' %}">
 
 
 여기서 user는 자동으로 user 앱을 인식하는 것이 아니라 urls.py에서 app_name = user를 명시해야 인식한다.
 
 
2. template 파일에서
 
다음과 같은 input 이 있을 때
 
<input
  type="text",
  name="username",
  placeholder="username",
  id="username",
  class="username"
  />
 
거의 모든 변수값을 username으로 지정하여 좀 헷갈릴 수도 있는데
type은 input할 변수의 특징을 지정, name은 명칭, placeholder는 힌트와 같은 텍스트 표시, id와 class는 CSS와 JS 구현 시 필요하다. 
 
"여기서, 백엔드 서버 데이터에 표기되는 정보는 name이다."
 
 
2-1. template 파일과 views.py를 연결
 
그렇기 때문에, 로그인 정보를 POST 할 때 user/views.py에서, username = request.POST.get('username') 
"위 html의 input에 의해 입력된 데이터의 name에 해당하는 username을 get 해온 후 POST한다" 라고 보면 된다.
from django.contrib.auth import authenticate, login as loginsession


...(생략)...

def login(request):
    if request.method=='GET':
        return render(request, 'login.html')
    elif request.method =='POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = auth.authenticate(request, username=username, password=password)
        print(username, password)
        if user is not None:
            loginsession(request, user)
            return redirect('/')
        else:
            return render(request, 'login.html', {'error': '아이디와 비밀번호를 확인해 주세요!'})
 
위에서 auth의 login을 호출했기 때문에 if user is not None 에서 보통 login(request, user) 을 적용하지만 위에서 이미 자체적으로 login 함수를 define 했기 때문에 서버 입장에서는 다소 혼선이 있을 수 있다. 따라서 login 대신 loginsession을 호출한 후 loginsession(request, user)을 사용하면 혹시 모를 충돌을 방지할 수 있다. 
 
 
3. request 관련
def user(request):
	print(request.user)
	return HttpResponse("로그인 성공")
 
보통, request 는 뒤에 .method나 method의 일종인 .POST, .GET을 붙여 표기하기 마련인데 print의 request.user라고 표시된 것은 다소 생소한데, 장고가 편리하게 request에서 쿠기검사해서 쿠키 내 세션 아이디와 동일하면 그 user 값 보여주는 것이라고 보면 된다.
 
# 예시
print(request.user.date_joined)  # 계정 생성 날짜 기록
print(request.user.last_login)  # 마지막으로 로그인한 시간 기록

위와 같이 user뒤에 추가로 적어줄 수도 있다.

 

3. url에 사용자명을 표기하고 싶을때,

# users/urls.py

app_name = 'users'

urlpattern = [
    path("signup/", views.signup, name="signup"),
    path("login/", views.login, name="login"),
    path("user/", views.user, name="user"),
    path("<str:username>/", views.profile, name="profile")
]
# user/views.py

...(생략)...

def profile(request, username):
    print(username)
    return(HttpResponse(username)

다음과 같이 표기하면, http://127.0.0.1:8000/ (username) 으로 url 입력하면 (username)이 프린트된다.