Django - Dstagram part2-Account app
Web/Django

Django - Dstagram part2-Account app

뉴비뉴 2019. 7. 18.

accounts 앱 만들기

1. python manage.py startapp accounts

 

2. settings.py INSTALLED_APPS = [ 'accounts' ]

 

로그인, 로그아웃 기능 추가

로그인, 로그아웃 기능은 Django 에 이미 만들어져있는 기능입니다. 이 기능을 그대로 불러다 쓰기 위해서 accounts앱 폴더에 urls.py 를 만들고 기존에 있는 뷰를 불러다가 사용하겠습니다. 여기서 말하는 기존의 뷰는 로그인,로그아웃 뷰!

urls.py

from django.urls import path
from django.contrib.auth import views as auth_view

urlpatters = [
    path('login/', auth_view.LoginView.as_view(), name='login'),
    path('logout/', auth_view.LogoutView.as_view(template_name='registration/logout.html'), name='logout'),
]

그리고 이 urls.py 를 사용하기 위해 루트 urls.py 에 연결합니다.

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

이제 로그인 로그아웃 기능을 동작할 것입니다, 템플릿을 만들고 마무리 하겠습니다.

login.html

{% extends 'base.html' %}
{% block title %}- Login{% endblock %}

{% block content %}
<div class="row">
    <div class="col-md-2"></div>
    <div class="col-md-8 panel panel-dafault">
        <div class="alert alert-info">Please enter your login informations.</div>
        <form action="" method="post">
            {{form.as_p}}
            {% csrf_token %}
            <input type="submit" class="btn btn-primary" value="Login">
        </form>
    </div>
    <div class="col-md-2"></div>
</div>
{% endblock %}

logout.html

{% extends 'base.html' %}
{% block title %}- Logout{% endblock %}

{% block content %}
    <div class="row">
        <div class="col-md-2"></div>
        <div class="col-md-8 panel panel-default">
            <div class="alert alert-info">You have been successfully logged out.</div>
            <a href="{% url 'login' %}" class="btn btn-primary">Click to Login</a>
        </div>
        <div class="col-md-2"></div>
    </div>

ㄷ두 개의 템플릿을 완성하면 메인 메뉴에 있는 링크도 연결을 해줘야 합니다. base.html에서 login, logout 링크를 찾아가서 href 속성을 수정해보자.

templates/base.html

<li class="nav-item"><a href="{% url 'logout' %}" class="nav-link">Logout</a></li>

<li class="nav-item"><a href="{% url 'login' %}" class="nav-link">Login</a></li>

로그아웃 버튼 클릭 시 로그아웃이 되었다는 메시지와 함께 logout.html 템플릿이 보이고, Click to Login 누르고 로그인 버튼을 누르면 Page not found 가 뜨면서 http://127.0.0.1:8000/accounts/profile/ profile 이라는 페이지로 이동한다. 하지만 우리는 만들어두지 않았기 때문에 Page not found 오류만 나타난다. 로그인 후 이동할 페이지 설정의 기본값이 profile이기 때문이다. 로그인 후에 바로 메인 페이지로('/') 이동할 수 있도록 변경해보자.

settings.py

LOGIN_REDIRECT_URL = '/'

메인 페이지로 잘 이동되는 걸 확인할 수 있다.

 

회원가입 기능 만들기

로그인 로그아웃 기능은 회원 가입 기능이 없다면 쓸모 없는 기능입니다. 회원 가입 기능을 만들기 위해서는 뷰를 만들어야 하고 폼도 만들어야 합니다. 회원가입 양식인 폼을 만들기 위해서 forms.py 파일에 코드를 입력하겠다.

forms.py

from django.contrib.auth.models import User
from django import forms

class RegisterForm(forms.ModelForm): # 회원가입 양식을 출력하기 위해 RegisterForm 이라는 클래스 생성
    password = forms.CharField(label='Password', widget=forms.PasswordInput) # PasswordInput -- Input 태그 사용
    password2 = forms.CharField(label='Repeat Password', widget=forms.PasswordInput) # 회원 가입 시 비밀번호 재입력
    
    class Meta:
        model = User # model 설정
        fields = ['username','first_name','last_name','email'] # 입력받을 필드를 지정
    
    def clean_password2(self): # clean_필드명 형태의 메서드이다. 
        cd = self.cleaned_data # clean_필드명 형태의 메서드에서 해당 필드의 값을 사용할 때는 꼭 cleaned_data에서 필드값을 찾아서 사용해야 한다.
        if cd['password'] != cd['password']: # password와 password2가 같은지를 비교하는 코드 실행
            raise forms.ValidationError('Passwords not matched!')
        return cd['password2']

views.py

from django.shortcuts import render
from .forms import RegisterForm

def register(request):
    if request.method == 'POST':
        user_form = RegisterForm(request.POST) # 회원가입 정보가 서버로 전달되었다.
        # Post 방식으로 뷰를 호출했다는 것은 서버로 자료를 전달하는 상태라는 것이다.
        if user_form.is_valid(): # 유효성 검사 이상이 없으면 데이터베이스에 저장
            new_user = user_form.save(commit=False) # 폼 객체에 지정된 모델을 확인하고 이 모델을 객체로 만든다.
            # 이 때 옵션으로 commit=False를 지정했기 때문에 데이터베이스에 저장하는 것이 아니라 메모리 상에 객체만 만들어진다.
            new_user.set_password(user_form.cleaned_data['password']) # 비밀번호 지정 이러한 과정을 거쳐야 암호화된 상태로 저장
            new_user.save() # 실제 데이터베이스에 저장
            return render(request, 'registration/register_done.html', {'new_user':new_user})
    else: # request가 POST 가 아니라면 입력을 받는 화면을 보여줘야 한다.
            user_form = RegisterForm() # 비어있는 RegisterForm 객체를 만들고 register 템플릿을 렌더링해 보여준다.
    return render(request, 'registration/register.html',{'form':user_form})

작성한 뷰를 사용하기 위해 URL을 연결해보겠습니다.

urls.py

from .views import register # views.py 에 작성한 register를 import 한다.

    path('register/', register, name='register'), # url,view이름,네이밍

register 뷰를 연결해주었다, 그리고 회원가입 페이지를 위한 템플릿을 작성해보자.

register.html

{% extends 'base.html' %}

{% block title %}- Registration {% endblock %}

{% block content %}
<div class="row">
    <div class="col-md-2"></div>
    <div class="col-md-8 panel panel-default">
        <div class="alert alert-info">Please enter your account informations.</div>
    </div>
    <form action="" method="post">
        {{form.as_p}}
        {% csrf_token %}
        <input type="submit" class="btn btn-primary" value="Register">
    </form>
    <div class="col-md-2"></div>
</div>
{% endblock %}

register_done.html

{% extends 'base.html' %}

{% block title %}- Registration Done{% endblock %}

{% block content %}
<div class="row">
    <div class="col-md-2"></div>
    <div class="col-md-8 panel panel-defualt">
        <div class="alert alert-info">Registration Success. Welcome, {{new_user.username}}</div>
    </div>
    <a href="/" class="btn btn-info">Move to main</a>
    <div class="col-md-2"></div>
</div>
{% endblock %}

 

views.py 부분 이해가 필요하다.

댓글

💲 추천 글