[1] 개요
1. URL
- HOST/login
2. 구성
- 아이디 입력창
- 비밀번호 입력창
- 로그인 버튼
- 현재 아이디찾기, 비밀번호찾기 기능은 구현X
- 아이디 또는 비밀번호가 잘못된 경우, 입력한 ID는 입력창에 그대로 뜨게 하고, 하단에 메시지 출력
[2] CODE
1. HTML
- id와 pwd를 form으로 받아서 POST 방식으로 /loginimpl 요청
- input 속성에 required 부여하여, 아이디와 비밀번호 모두 입력 받도록 구현
- 로그인을 시도하지 않은 상태에서는 context에 id가 없어서 "아이디 또는 비밀번호가 일치하지 않습니다."
메시지를 띄우지 않고, 잘못된 아이디 또는 비밀번호로 시도한 경우 화면을 다시 띄울 때, context['id']에 입력했던
아이디를 저장하게 되어 if문 조건이 참이되므로 메시지를 띄우게 된다.
/templates/login.html
<section class="p-5">
<div class="m-5" style="position:absolute; left:50%; transform:translateX(-50%); width:50%;">
<header class="container" style="text-align:center; width:100%;">
<h3 style="white-space:nowrap;">로그인</h3>
</header>
<form action="loginimpl" method="POST" style="text-align:center;">
{% csrf_token %}
<div class="input-box">
<input id="custid" type="text" name="custid" placeholder="아이디" autocomplete="off" value="{{id}}" required>
<label for="custid">아이디</label>
<div class="p-1" style="text-align:right">
<button class="forgot" id="forgotid" style="text-align:right; width:85px;" type="button">아이디찾기</button>
</div>
</div>
<div class="input-box">
<input id="custpw" type="password" name="custpw" placeholder="비밀번호" autocomplete="off" required>
<label for="custpw">비밀번호</label>
<div class="p-1" style="text-align:right">
<button class="forgot" id="forgotpw" style="text-align:right; width:85px;" type="button">비밀번호찾기</button>
</div>
</div>
{% if id != '' %}
<div class="input-box">
<span style="color: red;">아이디 또는 비밀번호가 일치하지 않습니다.</span>
</div>
{% endif %}
<div class="p-2" style="position:absolute; left:50%; transform:translateX(-50%); width:100%;">
<input type="submit" value="로그인" style="width:80%">
</div>
{% if center != None %}
{% include center %}
{% else %}
<section></section>
{% endif %}
</form>
</div>
</section>
2. CSS
- 기본템플릿 CSS 적용
- 입력창에 라벨을 추가하여, 입력창 focused 되었을 때 라벨 글자가 작아지면서 좌상단으로 이동하도록 구현
/static/css/styles.css
input:placeholder-shown + label {
color: #aaa;
font-size: 14pt;
top: 16px;
}
input:focus + label, label {
color: #8aa1a1;
font-size: 8pt;
pointer-events: none;
position: absolute;
left: 0px;
top: 0px;
transition: all 0.2s ease;
-webkit-transition: all 0.2s ease;
-moz-transition: all 0.2s ease;
-o-transition: all 0.2s ease;
}
3. JavaScript
- 적용 사항 없음
4. Application
1) login( )
- 로그인 화면 출력
- 첫 로그인 시도인 경우 request.GET에 아무것도 존재하지 않으므로, context['id'] 에 빈 문자열('')을 넣어서 전송
2) loginimpl( )
- 로그인 화면에서 로그인 버튼 클릭 시 실행
- form에 있는 입력값인 id와 pwd를 POST 방식으로 받아서, DB의 cust 테이블 정보와 비교
① id, pwd 모두 일치할 경우 request.session에 해당 고객 정보 저장하고 홈화면으로 이동
② id가 없을 경우, id는 있지만 pwd가 일치하지 않을 경우 예외 발생
-> 해당 id를 로그인화면 요청 URL에 querystring으로 포함시켜서 전송 - redirect('/login?id='+id)
-> login( ) 에서 request.GET 에 'id' 있는 것을 확인하고, context에 해당 id를 넣어서 로그인 화면과 함께 전송
/web/views.py -> class MyView(View)
@request_mapping("/login", method="get")
def login(self, request):
//print(request.GET)
if 'id' in request.GET:
context = {
'id': request.GET['id']
}
else:
context = {
'id': ''
}
return render(request, 'login.html', context);
@request_mapping("/loginimpl", method="post")
def loginimpl(self, request):
# id, pwd 를 프로그램을 확인 한다.
id = request.POST['custid'];
pwd = request.POST['custpw'];
try:
cust = Cust.objects.get(id=id);
if cust.pwd == pwd:
request.session['sessionid'] = cust.id;
request.session['sessionname'] = cust.name;
request.session['sessionimg'] = cust.custimg;
else:
raise Exception;
except:
return redirect('/login?id='+id);
return redirect('/');
- 끝 -
'프로젝트형 IoT 서비스 개발 4회차 > 인터페이스 개발 프로젝트 - 음식점 리뷰 사이트' 카테고리의 다른 글
2. 화면 구성 - (9) 회원정보 화면 (0) | 2022.03.25 |
---|---|
2. 화면 구성 - (8) 회원가입 화면 (0) | 2022.03.24 |
2. 화면 구성 - (6) 고객센터 - 고객 상담 게시판 (0) | 2022.03.20 |
2. 화면 구성 - (5) 고객센터 - 실시간 채팅 상담 (0) | 2022.03.20 |
2. 화면 구성 - (4) 고객센터 - 자주 묻는 질문 (0) | 2022.03.20 |