Django 사용자 인증 시도
개요
파이톤의 온전한 WEB 프레임워크 Django의 사용자 인증 기능을 시험해 보고 싶어서 간단한 ToDo 목록을 만들었는데 다음에 소개해 드리겠습니다.
본 보도의 전제지식은 Django의 자습서에 해당하는 내용이다.
또한, Django의 사용자 인증 기능 참조공식 문서.
또 제작된 앱은 GiitHub의 창고에 놓았다.
응용 프로그램의 개요는 다음과 같다.
Django의 인증 기능
사용자 작성
django.contrib.auth.models.User는 Django의 사용자 모델로, 주요 속성은 다음과 같습니다.
사용자를 만들려면 다음 함수
create_user()
를 사용합니다.from django.contrib.auth.models import User
user = User.objects.create_user('username', '[email protected]', 'password')
사용자 인증
Django가 HTTP에 인증 여부를 판별해 달라고 요청했습니다.
요청
request
에 현재 사용자를 나타내는 request.user
속성이 부여되었습니다.사용자가 현재 로그인하지 않으면 이 속성은
AnonymousUser
실례를 설정하고, 로그인한 경우 User
실례를 설정합니다.이 두 사람은
is_authenticated
로 다음과 같이 식별할 수 있다.if request.user.is_authenticated:
# Do something for authenticated users.
...
else:
# Do something for anonymous users.
...
또한 로그인한 사용자가 어떤 사용자인지 식별하려면foo_user
다음과 같다.if request.user == foo_user:
# Do something for foo_user.
...
로그인
login()
함수를 사용하여 로그인합니다.username 및 password 는 POST 요청에서 가져오려고 합니다.
from django.contrib.auth import authenticate, login
def login_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
취소
logout()
함수를 사용하여 로그아웃합니다.from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
ToDo 목록 소개
ToDo 목록의 개요는 다음과 같습니다.
작업 모델에서 Django 사용자 모델 참조
작업 모델에는 Django 사용자와 작업 이름의 속성만 있습니다.
작업 모델에서 Django 사용자 모델을 참조하려면 외부 참조 키
django.conf.settings.AUTH_USER_MODEL
를 사용합니다.또한
name
속성을 독특하게 만드는 이유는 본 기사와 무관하게 설정을 시도하려는 시도가 있을 때의 행동이니 신경 쓰지 마십시오.todo_list/models.py
from django.conf import settings
from django.db import models
class Task(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
name = models.CharField(max_length=255, unique=True)
def __str__(self):
return self.name
작업 CRUD에 대한 사용자 인증
작업 읽기
제3자가 임무를 보는 것을 피하다.
tasks = Task.objects.filter(user=request.user)
로그인 사용자와 관련된 작업만 추출하여 디스플레이 함수render()
에 전달합니다.todo_list/views.py의 발췌문
from django.http import HttpRequest, HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from .models import Task
def index(request: HttpRequest) -> HttpResponse:
if not request.user.is_authenticated:
return HttpResponseRedirect('login/')
tasks = Task.objects.filter(user=request.user)
return render(
request,
'todo_list/todo_list.html',
{'username': request.user.username, 'tasks': tasks}
)
HTML의 템플릿 파일은 다음과 같습니다.todo_list/templates/todo_list/register.html
<h1>ToDo List of {{ username }}</h1>
{% if tasks %}
<ul>
{% for task in tasks %}
<li>
<div style="display:inline-flex">
<form action="/task/update/" method="post">
{% csrf_token %}
<input type="hidden" name="id" value="{{ task.id }}">
<input type="text" name="name" value="{{ task.name }}" required>
<input type="submit" value="update">
</form>
<form action="/task/delete/" method="post">
{% csrf_token %}
<input type="hidden" name="id" value="{{ task.id }}">
<input type="submit" value="delete">
</form>
</div>
</li>
{% endfor %}
</ul>
{% else %}
<p>No task is registered.</p>
{% endif %}
<form action="/task/create/" method="post">
{% csrf_token %}
New task:
<input type="text" name="name" required>
<input type="submit" value="add">
</form>
<form action="/logout/" method="post">
{% csrf_token %}
<input type="submit" value="logout">
</form>
작업 생성
로그인한 사용자만 작업을 만들 수 있습니다.
작업을 제작할 때 HTML로 POST 요청을 전달합니다
create_task()
.create_task()
에서 POST 이외의 요청을 거부하거나 로그인하지 않았을 때의 요청(404회신)에 따라 먼저 check_task_request()
.또한 POST 요청 내
name
속성에 따라 퀘스트를 제작하고 마지막으로 퀘스트 표시 페이지로 전환합니다.todo_list/views.py의 발췌문
from django.http import Http404, HttpRequest, HttpResponse, HttpResponseRedirect
from .models import Task
def check_task_request(request: HttpRequest) -> None:
if request.method != 'POST':
raise Http404('Request method is not POST.')
user=request.user
if not user.is_authenticated:
raise Http404('User is not authenticated.')
def create_task(request: HttpRequest) -> HttpResponse:
check_task_request(request=request)
name = request.POST.get('name')
if name is None:
Http404('Task name is not set.')
task = Task(user=request.user, name=name)
task.save()
return HttpResponseRedirect('../../')
작업 업데이트 및 삭제
작업을 작성한 사용자만 작업을 업데이트하고 삭제할 수 있습니다.
작업 업데이트와 삭제는 HTML 형식으로 POST 요청을 각각
update_task()
와 delete_task()
에 전달합니다.작업 생성과 마찬가지로 POST 이외의 요청을 거부하거나 로그인하지 않았을 때의 요청
check_task_request()
에 따라 404 응답을 되돌려줍니다.또한 POST 요청 내
id
속성에 따라 업데이트, 삭제가 필요한 작업을 결정합니다.if task.user != request.user
섹션에서 이 작업과 연관된 사용자와 로그인한 사용자의 일치성을 확인하고 404 응답을 동시에 반환하지 않습니다.문제가 없으면 업데이트나 삭제를 진행하고 작업 표시 페이지로 다시 지정합니다.
todo_list/views.py의 발췌문
from django.http import Http404, HttpRequest, HttpResponse, HttpResponseRedirect
from .models import Task
def check_task_request(request: HttpRequest) -> None:
if request.method != 'POST':
raise Http404('Request method is not POST.')
user=request.user
if not user.is_authenticated:
raise Http404('User is not authenticated.')
def update_task(request: HttpRequest) -> HttpResponse:
check_task_request(request=request)
id_ = request.POST.get('id')
name = request.POST.get('name')
if id is None or name is None:
Http404('Task id or name is not set.')
task = Task.objects.get(pk=id_)
if task.user != request.user:
raise Http404("Another user's task can't be edited.")
task.name = name
task.save()
return HttpResponseRedirect('../../')
def delete_task(request: HttpRequest) -> HttpResponse:
check_task_request(request=request)
id_ = request.POST.get('id')
if id is None:
Http404('Task id is not set.')
task = Task.objects.get(pk=id_)
if task.user != request.user:
raise Http404("Another user's task can't be edited.")
task.delete()
return HttpResponseRedirect('../../')
총결산
Django의 사용자 인증 기능을 테스트하기 위해 제작된 ToDo 목록을 소개했다.
파이토존에서 WEB 앱을 개발하면 Django 이외에 Flash 등도 선택할 수 있다.
Flash의 경우 데이터베이스 협업과 인증은 플러그인 패키지를 가져와야 하는데 그 선택이 번거롭기 때문에 Django를 선택했습니다.
실제로 사용해 봤지만 큰 미혹 없이 사용했다.
Django 자체가 일주일 동안 사용해 봤는데 안 좋은 코드일 수도 있어요. 눈치채신 분들은 댓글을 받게 되면 기쁠 거예요.
Reference
이 문제에 관하여(Django 사용자 인증 시도), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/teasy/articles/django-auth-sample텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)