Django 사용자 인증 시도

33882 단어 djangoPythontech

개요


파이톤의 온전한 WEB 프레임워크 Django의 사용자 인증 기능을 시험해 보고 싶어서 간단한 ToDo 목록을 만들었는데 다음에 소개해 드리겠습니다.
본 보도의 전제지식은 Django의 자습서에 해당하는 내용이다.
또한, Django의 사용자 인증 기능 참조공식 문서.
또 제작된 앱은 GiitHub의 창고에 놓았다.
응용 프로그램의 개요는 다음과 같다.
  • 각 사용자에 대해 여러 작업을 등록할 수 있습니다.
  • 등록된 사용자만 작업을 확인, 업데이트, 삭제할 수 있습니다.
  • 사용자 인증을 위해 등록, 로그인, 로그아웃 페이지가 있습니다.
  • 작업의 편집 화면은 >와 css에 공을 들이지 않았기 때문에 이해하기 어렵지만 다음과 같다.

    Django의 인증 기능


    사용자 작성


    django.contrib.auth.models.User는 Django의 사용자 모델로, 주요 속성은 다음과 같습니다.
  • username
  • password
  • email
  • 또한username과password는 필수 항목입니다.
    사용자를 만들려면 다음 함수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 자체가 일주일 동안 사용해 봤는데 안 좋은 코드일 수도 있어요. 눈치채신 분들은 댓글을 받게 되면 기쁠 거예요.

    좋은 웹페이지 즐겨찾기