코딩공부/Python Django

KKU likelion django project (2)

integerJI 2020. 1. 2. 11:40

---
title: "LikeLion KKU 두 번째 Review"
date: 2019-10-04 00:00:00 -0400
categories: jekyll update
---

# 두 번째 복습 시간 리뷰

### 글쓰기와 사용자를 관리하며 생긴 오류와 궁금증 

- 회원가입시 동일한 아이디가 있을 경우에 대하여

기존 classlion 강의를 보며 작성한 코드를 보면

```
def signup(request):
    if request.method == 'POST':
        if request.POST['password1'] == request.POST['password2']:
            user = User.objects.create_user(
                request.POST['username'], password=request.POST['password1'])
            auth.login(request, user)
            return redirect('home')
    return render(request, 'signup.html')
```
이렇게 되어있다.

이렇게 할 경우의 문제점이 

```
1. 비밀번호를 입력 안 해도 회원가입이 된다.
2. 에러가 나서 signup로 리턴하게 될 경우 사용자는 무엇이 잘못되었는지 모른다.
3. 중복된 아이디를 체크할 수 없다.
```

이러한 문제점이 발생한다. (물론 더 있을 수 있다.)

오류를 고치기 전에 request 받는 값을 간편하게 적기 위하여 코드를 변경해 주었다.

```
def signup(request):
    if request.method == 'POST':
    username = request.POST['username']
    password1 = request.POST['password1']
    password2 = request.POST['password2']
    
        if password1 == password2:
            user = User.objects.create_user(username, password=password1)
            auth.login(request, user)
            return redirect('home')
    return render(request, 'signup.html')
```

코드를 쓸 때마다 `request.POST['username']`를 적어주는 것이 번거로워

위에 선언을 해주었다. username란 변수에 request.POST['username']값을 담고 이와 같이 password도 담아주었다

그 후 request.POST['password1']는 password1로 바뀌게 됨으로 request 값들을 선언해준 변수로 바꾸어 주었다.


이제 2번째 오류를 고쳐보자

```from django.contrib import auth, messages```

`django.contrib` 에서 `messages`를 추가해 주자.

messages를 추가하여 상황이 발생하였을 때 messages를 출력할 수 있다.

이를 출력하기 위하여 `signup.html` 에 아래의 함수

여기는 이상하게 안 나옴 ㅠ.ㅠ---
```
{% if messages %}
{% for message in messages %}
{{ message.tags }}

{{ message.message }}

{% endfor %}
{% endif %}
```
---여기까지
를 넣어주자

이 코드는 해당 html에서 함수가 실행되었을 때 해당 `messages`를 출력하여준다.

이제 1번째 오류를 가보자 1번째 오류는

먼저 값이 입력이 안됐을 경우의 상황을 만들어 주면 된다.

이는 python에서 `is None` 이라는 코드를 입력하면 된다. 


```if username and password1 is not None:```

만약에 username과 password1의 값이 있을 경우 

`is not None` 을 붙여주어 값이 있을 때만 회원가입을 진행하게 해 주었고

```
if username and password1 is not None:

    if password1 == password2:
    user = User.objects.create_user(username, password=password1)
    auth.login(request, user)
    return redirect('home')
    
    else:
    messages.info(request, '비밀번호가 다릅니다.')
    return render(request, 'signup.html')

else:
messages.info(request, '값을 입력해주세요')
return render(request, 'signup.html')
```

값이 비어있을 경우에는 signup로 돌아가게 해 주었다.

또한 여기서 오류 메시지를 출력하기 위하여 

해당 페이지로 `return` 하기 전 `messages` 함수를 사용하여 원하는 문구의 오류를 출력하여 준다.

이렇게 1번째 오류와 2번째 오류를 수정하였다.

[messages] 참고자료

[messages]: https://ssungkang.tistory.com/entry/Djangomessage-framework-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0



---
## 최종 수정

```
def signup(request):
    if request.method == 'POST':
        username = request.POST['username']
        password1 = request.POST['password1']
        password2 = request.POST['password2']

        if not username:
            messages.info(request, '아이디를 입력해 주세요')
            return render(request, 'signup.html')

        if not password1:
            messages.info(request, '비번을 입력해 주세요')
            return render(request, 'signup.html')

        if password1 == password2:
            if User.objects.filter(username=username).exists():
                messages.info(request, '아이디가 중복됩니다.')
                return render(request, 'signup.html')
            else:
                user = User.objects.create_user(username, password=password1)
                auth.login(request, user)
                return redirect('home')
        else:
            messages.info(request, '비밀번호가 다릅니다.')
            return render(request, 'signup.html')
        


    return render(request, 'signup.html')
```

# 로그아웃 방식은 `post` ? `get` ?

 - 참고자료 [get과 post], [get과 post2]
 
 찾아보고 정리하자면
 
 사용자 세션의 상태에 영향을 주는 것은 결코 행동을 취하지 않아야 한다고 한다.
 
 2010년도를 생각하면 get방식도 상관이 없었으며 post방식은 과잉 방식이지 않나 생각할 수 있었겠지만
 
 2013년도를 지나 인터넷 브라우저도 진화하면서 브라우저가 할 수 있는 게 늘어남에 따라
 
 위험성의 증가와 인증되지 않은 get방식으로 정보를 해킹당하거나 사용자가 원치 않아도 로그아웃이 될 수 있기 때문이다.

[get과 post]: https://code-examples.net/ko/q/35bb0a
[get과 post2]: https://codeday.me/ko/qa/20190405/244363.html

'코딩공부 > Python Django' 카테고리의 다른 글

KKU likelion django project (4)  (0) 2020.01.02
KKU likelion django project (3)  (0) 2020.01.02
KKU likelion django project (1)  (0) 2020.01.02
KKU likelion rest project (4)  (0) 2019.10.28
KKU likelion rest project (3)  (1) 2019.10.28