[다시, 장고]Muklog - 로그인, 로그아웃, 회원가입

Adela·2020년 7월 12일
1

다시, 장고

목록 보기
3/6
post-thumbnail

오늘 진행한 것들

  • 로그인
  • 로그아웃
  • 회원가입

app 만들기

회원관리를 도맡을 새로운 앱을 생성했다.

바로 accounts 되시겠다.

settings.py에 app 알리기

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'map.apps.MapConfig',
    'blog.apps.BlogConfig',
    'accounts.apps.AccountsConfig', # 앱 추가했다.
]

프로젝트 urls.py에 accounts의 urls.py 알리기

다른 앱들과 마찬가지로 accounts 또한 urls.py 파일을 따로 만들어 거기에 url을 만들어주었다.

urlpatterns = [
    path('admin/', admin.site.urls),
    path('map/', include('map.urls')),
    path('blog/', include('blog.urls')),
    path('accounts/', include('accounts.urls')), # accounts.urls 추가 
]

회원가입

django에서 제공해주는 auth 모델을 사용했다.

html 만들기

<div>
    <h1>회원가입</h1>
    <form action="{% url 'signup' %}" method="POST">
        {% csrf_token %}
        Username: <input type="text" name="username" id="">
        <br>
        Password: <input type="password" name="password1" id="">
        <br>
        Confirm Password: <input type="password" name="password2" id="">
        <br>
        <!-- <input type="hidden" name="path" value={{request.path}}> -->
        <input type="submit" value="sign up">
    </form>
</div>

아이디(username), 비밀번호, 비밀번호 확인을 받아 회원가입을 한다.
<input>name이 매우 중요하다. 저 name으로 뷰에서 해당 값을 받아올것이기 때문이다.

뷰 만들기

from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth.models import User # 장고가 주는 User 모델 
from django.contrib import auth

필요한 것들을 import 해준다.
물론 뷰를 작성하면서 필요할 때마다 import 해온 것이지만..

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

password1은 html에서 비밀번호 <input>name이었다.
password2는 html에서 비밀번호 <input>name이었다.

따라서,

  • 만약 password1 == password2, 즉 비밀번호와 비밀번호 확인의 값이 일치하면,
    👉🏻 (django가 제공하는) User 모델에 사용자의 username, password 값을 갖는 Objects를 만든다.
    👉🏻 로그인 성공
    👉🏻 이전페이지로 redirect 한다. (아직 이 부분을 해결하지 못해서.. 임시방편으로 login 페이지를 redirect 해주었다 ㅜㅜ)

  • 일치하지 않으면, 그냥 회원가입 페이지를 render한다.

url 만들기

from django.urls import path
from . import views as accounts

역시 필요한 것들을 import 해주고

urlpatterns = [
    path('signup/', accounts.signup, name="signup"),  
]

회원가입 뷰를 위한 url를 만들어준다.

로그인

사용자로부터 받은 username과 password가 User에 있는지 확인한다.

html 만들기

<div>
    {% if error %}
    {{ error }}
    {% endif %}
  <!-- 로그인 실패했을 때 띄울 메시지 -->
  
    <h1>로그인</h1>
    <form action="{% url 'login' %}" method="POST">
        {% csrf_token %}
        Username: <input type="text" name="username" id="">
        <br>
        Password: <input type="password" name="password" id="">
        <br>
        <input type="submit" value="login" id="">
    </form>

    <a href="{% url 'signup'%}">회원가입 고!</a>
    
</div>

사용자로부터 username과 password를 받는다.
마찬가지로 <input>name을 이용해 받을 예정이니, name을 잘 기억한다.

뷰 만들기

def login(request):
    if request.method == "POST":
        username = request.POST["username"]
        password = request.POST["password"]
        user = auth.authenticate(request, username=username, password=password)
        if user is not None:
            auth.login(request, user)
            return HttpResponseRedirect('/blog/')
        else:
            return render(request, 'login.html', {'error':'username or password is incorrect'})
            # 로그인 실패시 'username or password is incorrect' 메시지를 띄움  
    else:
        return render(request, 'login.html')

사용자로부터 username과 password를 받아 해당 유저가 모델에 있는 유저인지 확인한다.

  • 만약 있으면(is Not None):
    👉🏻 로그인하고 이전페이지로 redirect(이것 또한.. 일단은 그냥 홈으로.. 추후 이전페이지로 redirect 하도록 할 것임..)

  • 없으면:
    로그인 페이지를 render한다. 그리고 "아이디 혹은 비밀번호가 맞지 않는다"는 메시지를 출력한다.
    (django에서 message라는 기능이 있었던 것 같은데, 나중에 사용하고자 한다. 일단은 저렇게 간단하게 구현)

url 만들기

urlpatterns = [
    path('signup/', accounts.signup, name="signup"),
    path('login/', accounts.login, name="login"),

로그인을 위한 url 추가했다.

로그아웃

url과 뷰만 있으면 된다.

뷰 만들기

def logout(request):
    auth.logout(request)
    return HttpResponseRedirect('/blog/')

초간단...

로그아웃 끝이다.
redirect는 (여기 또한) 임시로 지정한 상태이다.. 어쨌든 저렇게 로그아웃 함수 적고, redirect해 줄 주소를 적으면 된다.

url 만들기

urlpatterns = [
    path('signup/', accounts.signup, name="signup"),
    path('login/', accounts.login, name="login"),
    path('logout/', accounts.logout, name="logout"),
]

로그아웃 url 추가 완료 !
로그아웃을 넣고 싶은 html 파일에 {% url 'logout' %} 으로 주솟값을 넣어 실행시켜주면 된다.

오늘 여기까지 했다.
여러가지 어렵고 힘든 일이 닥쳐도 꾸준히 꿋꿋이 하자! 💪🏻
열심히, 그리고 최선을 다하자. 후회없을 만큼!

profile
개발 공부하는 심리학도

0개의 댓글