Django, DRF, JWT 및 OpenApi를 사용하여 적절한 REST API 작성

28864 단어 pythondjangoopenapi

이 글의 요약.
이 문장에서 나는 다음과 같은 개념을 소개할 것이다. 만약 당신이 이미 그것들에 익숙하다면 다음 문장으로 넘어가십시오.
  • Django Rest 프레임워크를 사용하여 Django 프로젝트
  • 만들기
  • OpenApi 사양을 추가하여 API 문서 동적으로 생성
  • JWT(JSON Web 토큰)를 사용한 인증 및 인증

  • 단계 1 - 새 프로젝트 작성
    새 프로젝트를 시작합니다(PyCharm->new Django 프로젝트 또는 django-admin startproject restapi_article 사용).저는 기초 지식을 소개하지 않을 것입니다. 왜냐하면 당신은 수시로 Django Tutorial을 방문하여 공식 문서에서 배울 수 있기 때문입니다(본문을 작성할 때 공식 문서가 가장 좋다는 것을 발견했습니다).
    일단 Django 프로젝트를 설정하면 아래에python 라이브러리를 설치해야 합니다. (최상의 체험을 위해서는 virtual environment을 사용해야 합니다.)
  • Django
  • Djangorest 프레임
  • drf yasg
  • djangorestframework simplejwt
  • 표준을 준수하는 것이 항상 좋기 때문에 모든 라이브러리를 포함하는 requirements.txt 파일을 만들어야 합니다.프로젝트 루트 폴더 pip freeze > requirements.txt에서 이 명령을 사용하여 만들 수 있습니다.파일은 다음과 같습니다.
    asgiref==3.2.10
    certifi==2020.6.20
    chardet==3.0.4
    coreapi==2.3.3
    coreschema==0.0.4
    Django==3.1.1
    djangorestframework==3.11.1
    djangorestframework-simplejwt==4.4.0
    drf-yasg==1.17.1
    idna==2.10
    inflection==0.5.1
    itypes==1.2.0
    Jinja2==2.11.2
    MarkupSafe==1.1.1
    packaging==20.4
    PyJWT==1.7.1
    pyparsing==2.4.7
    pytz==2020.1
    requests==2.24.0
    ruamel.yaml==0.16.12
    ruamel.yaml.clib==0.2.2
    six==1.15.0
    sqlparse==0.3.1
    uritemplate==3.0.1
    urllib3==1.25.10
    
    다음으로 명령 python3 manage.py startapp restapi을 사용하여 응용 프로그램을 만듭니다
    생성된 파일 구조는 다음과 같습니다.
    . 
    ├── restapi
    │   ├── migrations
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── restapi_article
    │   ├── __init__.py
    │   ├── asgi.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── venv
    ├── db.sqlite3
    ├── manage.py
    └── requirements.txt
    
    이 세 가지 애플리케이션을 restapi_article\settings.py에 추가
    INSTALLED_APPS = [
        ...
        'rest_framework',
        'drf_yasg',
        'restapi',
    ]
    
    루트 restapi를 사용하기 위해 urls.py을 편집합니다.URL을 주요 API 응용 프로그램 URL로 합니다. 그러면 localhost:8000/admin은 Django 관리 패널과 함께 사용되고, /api/v1은 모든 URL의 접두사로 사용됩니다. (이것은 미래에 쉽게 변경할 수 있기 때문입니다.)
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('api/v1/', include('restapi.urls')),
    ]
    

    2단계 - 데이터 모델 생성
    나는 하루를 선택하고 쪽지를 붙일 수 있는 음주일기 앱이 있다고 생각한다.그 밖에 생물 분야, 장소와 생년월일의 사용자 프로필을 가지고 싶습니다.
    Profile과 Day는 DrinkingDay 모델을 통해 가능한 한 많은 관계에 연결될 것입니다. 저는 이 모델에서 어느 날의 메모를 발표할 수 있습니다. 예를 들어 제가 무엇을 마셨는지 누구와 마셨는지.
    TODO(미래): 이벤트 모델을 만들어서 당신과 함께 술을 마실 수 있는 사람들을 초대할 수 있습니다.그것은 여러 개의 프로필/사용자를 한 날짜와 조합해야 한다
    우리는 또한 signals을 사용하여 사용자가 만드는 갈고리를 만들 것입니다. 따라서 개요 파일 모델을 만들거나 업데이트하기만 하면 사용자는 요청을 통해 자동으로 만들거나 업데이트할 것입니다.models.py
    from django.contrib.auth.models import User
    from django.db import models
    from django.db.models.signals import post_save
    from django.dispatch import receiver
    
    
    class Day(models.Model):
        day = models.DateField()
    
    
    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        bio = models.TextField(max_length=500, blank=True)
        location = models.CharField(max_length=30, blank=True)
        birth_date = models.DateField(null=True, blank=True)
        days = models.ManyToManyField(Day, through='DrinkingDay')
    
    
    class DrinkingDay(models.Model):
        profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
        day = models.ForeignKey(Day, on_delete=models.CASCADE)
        note = models.TextField(max_length=1000, blank=True)
    
    # Use signals so our Profile model will be automatically created
    # or updated when we create or update User instance
    # https://docs.djangoproject.com/en/3.1/topics/signals/
    @receiver(post_save, sender=User)
    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            Profile.objects.create(user=instance)
    
    
    @receiver(post_save, sender=User)
    def save_user_profile(sender, instance, **kwargs):
        instance.profile.save()
    
    이제 DB에 대한 마이그레이션을 만들고 적용한 다음 관리 패널에 로그인할 수 있는 수퍼유저를 만듭니다.이 세 명령을 하나하나 실행해야 한다. (물론 전자메일과 사용자 이름을 변경할 수 있다.)
    python manage.py makemigrations
    python manage.py migrate
    python manage.py createsuperuser --email [email protected] --username admin
    

    3단계 - 시리얼화된 프로그램 만들기
    지금 우리는 serializers을 추가해야 한다.바로 가기의 시리얼은 객체에서 JSON을 작성하는 방법입니다.
    사용자와 개요 파일 모델에 대한 서열화 프로그램을 작성합니다. (사용자가 없으면 일을 할 수 없기 때문에 동시에 작성해야 합니다.)serializers.py
    from django.contrib.auth.models import User
    from rest_framework import serializers
    
    from restapi.models import Profile
    
    
    class UserSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = User
            fields = ['url', 'username', 'email', 'groups']
    
    
    class ProfileSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = Profile
            fields = ['user', 'bio', 'location', 'birth_date', 'days']
    

    4단계 - 뷰포트 세트 작성
    이제 Django에서 보기를 만들 수 있는 서열화 프로그램이 생겼습니다.그래서 url마다 우리가 원하는 걸 볼 수 있어요.UserView와 ProfileView에 대해 모두 이렇게 합시다. (비록 사용자 보기를 생략할 수 있지만, 이것은 필수적이지 않기 때문입니다.)views.py 변경(restapi 폴더에서):
    from django.contrib.auth.models import User
    from rest_framework import viewsets
    
    from restapi.models import Profile
    from restapi.serializers import ProfileSerializer, UserSerializer
    
    
    class UserViewSet(viewsets.ModelViewSet):
        """
        API endpoint that allows users to be viewed or edited.
        """
        queryset = User.objects.all().order_by('-date_joined')
        serializer_class = UserSerializer
    
    
    class ProfileViewSet(viewsets.ModelViewSet):
        """
        API endpoint that allows profiles to be viewed or edited.
        """
        queryset = Profile.objects.all()
        serializer_class = ProfileSerializer
    

    5단계 뷰포트에 라우터 등록
    DRF에서는 routers이라는 물건을 사용할 수 있습니다.이것은 Django에 대한 자동 URL 라우트를 처리합니다.urls.py 변경(restapi 폴더에서):
    from django.urls import path, include
    from rest_framework import routers
    
    from restapi import views
    
    router = routers.DefaultRouter()
    router.register(r'profile', views.ProfileViewSet)
    router.register(r'user', views.UserViewSet)
    
    urlpatterns = [
        path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
        path('', include(router.urls)),
    ]
    
    이제 python manage.py runserver을 사용하여 어플리케이션을 실행하고 http://127.0.0.1:8000/api/v1/으로 이동하여 어플리케이션이 제대로 작동하는지 확인할 수 있습니다.)
    슈퍼 사용자를 만들면 자동으로 프로필을 만들 것입니다. 따라서 http://127.0.0.1:8000/api/v1/profile/1/으로 이동하면 슈퍼 사용자 프로필을 업데이트할 수 있습니다.

    6단계 - 흔들림 문서 추가
    모든 것이 잘 되어 있습니다. 우리는 흔들리는 문서를 표시하기 위한 URL을 만들 수 있습니다.또한 schema 보기를 만들어서 다른 개발자에게 우리의 API를 설명하는 것도 좋은 실천이다.
    업데이트 urls.py (restapi 폴더에 있음):
    from django.urls import path, include, re_path
    from drf_yasg import openapi
    from drf_yasg.views import get_schema_view
    from rest_framework import routers, permissions
    
    from restapi import views
    
    router = routers.DefaultRouter()
    router.register(r'profile', views.ProfileViewSet)
    router.register(r'user', views.UserViewSet)
    
    schema_view = get_schema_view(
       openapi.Info(
          title="Drinking Day API",
          default_version='v1',
          description="This API allows us to keep a diary of our daily drinking",
          terms_of_service="https://www.scvconsultants.com",
          contact=openapi.Contact(email="[email protected]"),
          license=openapi.License(name="MIT License"),
       ),
       public=True,
       permission_classes=(permissions.AllowAny,),
    )
    
    urlpatterns = [
        path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
        path('', include(router.urls)),
        re_path(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
        path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    ]
    
    이제 우리는 다음과 같은 위치에서 거들먹거리는 사용자 인터페이스를 볼 수 있을 것이다.http://127.0.0.1:8000/api/v1/swagger/그리고json+.yaml 모드는 다음 링크에 있습니다.http://127.0.0.1:8000/api/v1/swagger.jsonhttp://127.0.0.1:8000/api/v1/swagger.yaml
    7단계 - 개요 파일 모델에 대한 액세스를 제한하기 위해 JWT 토큰을 추가합니다.
    먼저 settings.py을 업데이트하여 JWT auth 클래스를 추가해야 합니다.나는 또한 페이지를 추가했다. 이것은 매우 좋은 실천이기 때문에 집합을 위해 기본 페이지 크기를 사용할 수 있다. (우리는 모든 내용을 한 번에 보낼 필요가 없다. 그렇지?)
    # REST FRAMEWORK config
    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        'PAGE_SIZE': 25,
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework_simplejwt.authentication.JWTAuthentication',
        )
    }
    
    그리고, 우리는 영패를 잡고 리셋할 단점을 만들어야 한다. (안전상의 이유로 영패는 기한이 지나야 한다.)official documentation으로 직접 설정할 수 있습니다.urls.py에 넣어보도록 하겠습니다.
    from rest_framework_simplejwt.views import (
        TokenObtainPairView,
        TokenRefreshView,
    )
    
    urlpatterns = [
        ...
        path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
        path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
        ...
    ]
    
    현재 당신은 http://127.0.0.1:8000/api/v1/token/으로 이동하여 댓글로 당신의 슈퍼유저 증빙서류를 발송할 수 있습니다. 당신은 멋진 업무 영패를 받을 것입니다. 당신은 here을 디코딩하고 검증할 수 있습니다. 이것은 당신의 증빙서류에 대응하는 사용자 id(사용자 id는 1)로 디코딩해야 합니다.
    현재 보기에 권한을 추가하는 것은 매우 간단합니다. 첫 번째 가져오는 것은 views.py입니다
    from rest_framework import permissions
    
    그런 다음 ProfileViewSet을 사용하여 특정 뷰에 추가합니다.
    class ProfileViewSet(viewsets.ModelViewSet, mixins.UpdateModelMixin):
        ...
        permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    
    현재 우리는 사용자를 쉽게 추가할 수 있지만, 우리가 적당한 JWT 영패를 제공하지 않으면 개인 자료를 업데이트할 수 없습니다.전체 사용 권한 목록은 Rest 프레임워크 documentation에서 사용할 수 있습니다.

    다음:
  • GithubHeroku을 사용하여 CI/CD를 만듭니다.
  • Dockerization
  • API 및pytest
  • 통합 테스트

    좋은 웹페이지 즐겨찾기