본문 바로가기

Backup/Django

[Django #8] User Login and Logout

이번장에서는 우리의 user handling과 로그인 로그아웃 기능들을 만들어 볼것이다.

로그아웃부터 작업해보자면(쉬우니까) Django에서 이미 logout function을 제공한다.

/logout URL부터 만들어보자 


main/mysite/urls.py 를 아래와 같이 만들어라:


from django.urls import path from . import views app_name = 'main' # here for namespacing of urls. urlpatterns = [ path("", views.homepage, name="homepage"), path("register/", views.register, name="register"), path("logout", views.logout_request, name="logout"), ]

Now that we have the URL for it, let's create the view, which we've already decided will be a function called logout_request

Here's a great example of where you might decide to call your function "logout"...but we're trying to use logout from Django. We'd definitely like to not make that mistake, so make sure to not call it the same as the function we're going to be trying to use. Same thing when we go to make our login function...we'll have to call it something other than that!

mysite/main/views.py


이제 우리는 url이 view의 logout_request으로 넘겨주게되면 해야하는 기능을 만들면 된다. 

(함수이름을 logout, login으로 하면 Django 기본 제공 함수와 동일하기때문에 겹치지 않게 조심!)

mysite/main/views.py

...
  def logout_request(request):
    logout(request)
    messages.info(request, "Logged out successfully!")
    return redirect("main:homepage")
  ...

자 이제 로그인을 만들어보자

from django.contrib.auth.forms import UserCreationForm, AuthenticationForm

...

def login_request(request):
    form = AuthenticationForm()
    return render(request = request,
                  template_name = "main/login.html",
                  context={"form":form})

이제 마지막으로 html페이지를 만들어보자

mysite/main/templates/main/login.html

{% extends 'main/header.html' %}

{% block content %}

    <div class="container">
        <form method="POST">
        {% csrf_token %}
        {{form.as_p}}
            <button style="background-color:#F4EB16; color:blue" class="btn btn-outline-info" type="submit">Login</button>
        </form>
        Don't have an account? <a href="/register" target="blank"><strong>register here</strong></a>!
    </div>
{% endblock %}

마지막으로 링크만 추가하면 된다. urls.py:

    path("login", views.login_request, name="login"),

자 이제 http://127.0.0.1:8000/login에 가면 로그인 페이지가 보일테고

registration 페이지처럼 POST 를 받아서 처리하는 부분을 아직 안만들었음으로 아무일이 안생길것이다.


mysite/main/views.py

def login_request(request):
    if request.method == 'POST':
        form = AuthenticationForm(request=request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                messages.info(request, f"You are now logged in as {username}")
                return redirect('/')
            else:
                messages.error(request, "Invalid username or password.")
        else:
            messages.error(request, "Invalid username or password.")
    form = AuthenticationForm()
    return render(request = request,
                    template_name = "main/login.html",
                    context={"form":form})

자 로그인기능을 다 만들었다.

이제 Django에서 제공하는 form을 조금 수정할텐데 비밀번호를 잃어버렸을때 우리는 email을 통해서 주로 확인을 받는다.

이부분을 수정해보겠다.

create a new file: mysite/main/forms.py:

forms.py

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

class NewUserForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")

    def save(self, commit=True):
        user = super(NewUserForm, self).save(commit=False)
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user

views.py, 에는 우리가 새로만든 form을 import

from .forms import NewUserForm


'Backup > Django' 카테고리의 다른 글

[Django #10] Working with Foreign Keys  (0) 2019.02.05
[Django #9] Foreign Keys with Models  (0) 2019.02.05
[Django #7] Messages  (0) 2019.02.05
[Django #6] User Registration  (1) 2019.02.04
[Django #5] CSS  (0) 2019.02.03