728x90
반응형
SMALL
728x90
반응형
LIST
728x90
반응형
SMALL

 

앞에서 Django Swagger DRF(django Rest Framework)을 알아봤다면,
이번에는 Ninja에 대해서 알아보자.
DRF(Django Rest Framework) Swagger와 비교해 보고 싶으면 이전 포스팅 참고: Django-Swagger-DRF

 

■ Ninja 설치 및 사용법

1. Ninja 설치 : pip install django-ninja

2. 프로젝트 구조

3. Ninja 사용법

# django app의 views.py

from ninja import NinjaAPI

api = NinjaAPI()    # NinjaAPI() 괄호 안의 속성에 따라 사용자가 원하는 데로 변경 가능

 

@api.get("/get", tags=["get의 이름"], summary="get summary")    # tags, summary 등의 속성으로 api 정보를 줄 수 있음

def get(request, param1: int, param2: int = None):    # None 값을 주면 required(필수값)이 아님, 항상 필수값 뒤로 코딩하여야 함

    return {"result": param1 + param1}    # json 형식으로 return값 세팅

 

@api.get("/format/{a}and{b}")    # {} 안의 값에 따라 return값이 달라짐

def get_format(request, param1: int, param2: int):

    return {"add": param1 + param2, "multiply": param1 * param2}

 

@api.get("/response/", response={200: Item, 403: Error})    # Item, Error는 django app의 schemas.py에 선언

def get_response(request):

    if not request.user.is_authenticated:

        # response 형식에 따라 return값 세팅, message 외 다른 값을 추가해도 Error Class로 세팅이 이미 되어 있기 때문에 나오지 않음

        return 403, {"message": "Please sign in first"}

    return request.user

 

@api.api_operation(["POST", "PATCH"], "/path")    # post, patch 동시 선언

def mixed(request):

    return {"result": True}

 

@api.post("/post")

def post(request, param1: str, item: Item):    # Item은 django app의 schemas.py에 선언

    return {"result": True, "message": "메세지"}


# django app의 schemas.py

from typing import List

from ninja import Schema

 

class Item(Schema):

    name: str

    description: str

    price: float

    quantity: int

 

class Error(Schema):

    message: str


# django project의 urls.py에 선언

from django.contrib

import admin from django.urls import path

from django_app_2.views import api    # app import

 

urlpatterns = [

    path('admin/', admin.site.urls),

    path('api/', api.urls)

]

4. 실행화면

- 기본 url은 로컬 주소에 path에 설정된 값에 /docs를 붙이면 Swagger가 실행된다.

- http://127.0.0.1:8000/api/docs

Ninja Swagger 실행화면

5. views.py에 주석으로 달아놓은 부분을 바꿔가면서 api가 어떻게 바뀌는지 꼭 테스트해 보고, 추가적으로 기능이 필요하다면 Ninja 공식사이트를 참고하자.

    지식도 없고, 영어도 잘 못하는 내가 봐도 그렇게 어렵지 않게 설명이 잘 되어 있다. 

    - Ninja 공식사이트 : https://django-ninja.rest-framework.com/

 

728x90
반응형
LIST
728x90
반응형
SMALL
Django Swagger API를 만들다 보면, API별로 설명을 작성해야 Front개발자가 참고하여 API를 사용할 수 있다.
MarkDown을 사용하여 API 설명 작성하는 방법을 알아보자.

■ MarkDown을 사용한 API

1. 이전 포스팅에서 MarkDown을 사용하여 간단하게 API에 대한 설명을 적어보았다.

    (아래 이미지까지 소스는 링크 참고 : Swagger API 만들기)

MarkDown문법으로 작성한 operation_description

■ MarkDown 사용법

- API에 대한 설명은 함수안에서 """ """ 안에서 사용할 수 있다. ("""를 입력하면 감쌀수 있게 """가 자동으로 생성된다.)
1. 글씨크기 조절 # 1개부터 6개까지 사용 가능
2. 기울림꼴 * 또는 _
3. 굵게 ** 또는 __
4. 기울림꼴 + 굵게 *** 또는 ___
5. 취소선 ~~
6. 취소선 + 굵게 등 3, 4, 5와 동일하게 사용하되 ~~ 사용
7. 목록 * 목록
    * 목록 1
        * 목록 2
8. 링크 [나의 블로그 링크](https://200-rush.tistory.com/ "나의 블로그")
9. 테이블
- 규칙을 따라야 함
- 하단 3줄은 셀 중간중간에 값 넣을때 사용

|col1|col2|col3|
|---|---|---|
|col1row1|col1row1|col2row1|
|col1row2|col1row2|col2row2|
|col1row3|col1row3|col2row3|
|col1row4|||
||col2row5||
|||col3row6|
10. Line --- 또는 *** 또는 ___

 

■ MarkDown 적용한 실제 소스

1. 특수기호 안에서 특수기호를 표시하고 싶을 때에는 특수기호 앞에 \를 붙인다.

2. 중간중간에 ---, ***, ___은 라인을 표시하는 것으로 결과는 똑같이 표시된다.

3. 링크 관련해서는 실제 Swagger에서 글씨에 마우스를 올리면 "나의 블로그"이라는 설명이 표시된다.

# App의 views.py

@api_view(['PUT'])    # PUT API

def put_test(request):

    """

    # \# 1개

    ## \# 2개

    ### \# 3개

    #### \# 4개

    ##### \# 5개

    ###### \# 6개

    ---

    *\*을 사용한 기울임 꼴*

    **\*\*을 사용한 Bold**

    ***\*\*\*을 사용한 Bold 기울임 꼴***

    ---

    _\_을 사용한 기울임 꼴_

    __\_\_을 사용한 Bold__

    ___\_\_\_을 사용한 Bold 기울임 꼴___

    ***

    ~~\~\~을 사용한 취소선~~

    ~~**\~\~와\*\*을 사용한 Bold 취소선**~~

    ~~___\~\~\~와\_\_\_을 사용한 Bold 기울임 꼴 취소선___~~

    ___

    * 목록

        * 목록 1

            * 목록 2

    ---

    [나의 블로그 링크](https://200-rush.tistory.com/ "나의 블로그")

    ---

    |col1|col2|col3|

    |---|---|---|

    |col1row1|col1row1|col2row1|

    |col1row2|col1row2|col2row2|

    |col1row3|col1row3|col2row3|

    |col1row4|||

    ||col2row5||

    |||col3row6|

    """

    return Response(request)

 

■ 소스를 실행한 Swagger 화면

MarkDown 적용한 실행화면

728x90
반응형
LIST
728x90
반응형
SMALL
Django DRF(Django Rest Framework) View의 종류
1. APIView(CBV) - 클래스형 뷰
2. @api_view(FBV) - 함수형 뷰
이 2개 중 FBV 활용하는 법 알아보기
DRF(Django Rest Framework)가 세팅이 안되어 있으면 이전 포스팅 참고:  Django-Swagger-DRF-Setting

 

@api_view(FBV) - 함수형 뷰 사용 및 활용법

1. 뷰를 작성할 때 함수 위에 @api_view와 같이 Decorator(데코레이터)를 사용한다.

2. Decorator(데코레이터)를 사용하여 GET, POST API를 만드는 방법이다.

# App의 views.py

 

@api_view(['GET'])

def get_test(request):

    return Response(request)

 

# tags: API 명칭 설명

# manual_parameters: API에 Parameter 생성 (하단 api_params.py)

@swagger_auto_schema(method="POST", tags=["새로운 이름"], manual_parameters=get_test_params,

                                           operation_summary="api 이름", operation_description="api 사용법",

                                           responses={201: '201 Description', 400: '400 Description', 500: '500 Description'})

@api_view(['POST'])    # POST API

def post_test(request):

    return Response(request)

 

@swagger_auto_schema(method="PUT", tags=["새로운 이름"])

@api_view(['PUT'])    # PUT API

def put_test(request):

    # 5번 참고

    """

    # 제목 크기 1

    ## 제목 크기 2

    ### 제목 크기 3

    #### 제목 크기 4

    ##### 제목 크기 5

    ###### 제목 크기 6

    [나의 블로그](https://200-rush.tistory.com/ "나의 블로그 설명")

    """

    return Response(request)

 

@api_view(['GET', 'POST'])    # GET, POST 2개의 API 동시 생성

def get_post_test(request):

    return Response(request)


# App에 추가한 api_params.py

# (참고) App에 파일을 추가해도 되고, views.py에 작성해도 되나, parameter를 모아두기 위해서 api_params.py를 생성하여 관리하였다.

 

from drf_yasg import openapi

 

get_test_params = [

    openapi.Parameter(

        name="param_1",

        in_=openapi.IN_QUERY,

        description="param_1을 입력",

        required=True,

        type=openapi.TYPE_STRING,

        default="abc"

    )

]


# Project의 urls.py

 

urlpatterns = [

    path('/get', views.get_test),

    path('/post', views.post_test),

    path('/put', views.put_test),

    path('/get_post_test', views.get_post_test)

]

3. Swagger 실행화면

  - http://127.0.0.1:8000/swagger/

  - @api_view(['GET', 'POST'])로 지정한 get_post_test 함수는 아래와 같이 그룹으로 표시된다.

  - @swagger_auto_schema의 tags를 사용하면 함수이름이 아닌 새롭게 지정한 이름이 표시된다. tags이름이 같으면 그룹으로 표시된다.

API 리스트

4. manual_parameters를 사용하면 Parameter를 넣을 수 있는 칸이 활성화되고, operation_summary는 path옆에 나타나는 문구,

    operation_description는 api를 펼쳤을 때 나타나는 문구를 표시할 수 있다.

    responses는 결과코드를 세팅할 수 있다.

@swagger_auto_schema을 활용한 API

5. App의 views.py의 소스를 보면 operation_description은 함수 안에 """ """을 사용하여 표시가 가능하다.

    MarkDown 문법으로 operation_description을 작성하면 된다.

MarkDown문법으로 작성한 operation_description

6. MarkDown 사용법 : DjangoSwagger에서 MarkDown사용법

728x90
반응형
LIST
728x90
반응형
SMALL
Django에서 지원하는 DRF(Django Rest Framework) 간단하게 Setting 하기

 

기본적으로 Swagger연동을 위해서는 Django가 설치되어 있어야 한다.
또한 App, Project 생성되어있어야 한다.
준비가 안되어 있으면 이전 포스팅 참고: Python, Django, Anaconda Setting, PyCharm Project

 

Swagger(DRF) 세팅 방법 및 결과 확인

1. DRF(Django Rest Framework) 설치 : pip install djangorestframework

2. Drf-Yasg 설치 : pip install drg-yasg

3. settings.py에 설치된 install 한 app추가

INSTALLED_APPS = [

    ........,

    'drf_yasg',

    'rest_framework'

]

4. 복사, 붙여 넣기 수준으로 urls.py에 아래 소스 추가

from rest_framework.permissions import AllowAny

from drf_yasg.views import get_schema_view

from drf_yasg import openapi

from django.urls import re_path

 

# [5. 실행화면]과 비교하면 쉽게 이해 가능(모두 수정가능)

schema_view = get_schema_view(

    openapi.Info(

        title="Snippets API",

        default_version='v1',

        description="Test description",

        terms_of_service="https://www.google.com/policies/terms/",

        contact=openapi.Contact(email="contact@snippets.local"),

        license=openapi.License(name="BSD License"),

    ),

    public=True,

    permission_classes=[AllowAny]

    # [참고]

    # AllowAny(기본값) : 인증에 관계없이 모두 허용

    # IsAuthenticated : 인증된 요청만 허용

    # IsAdminUser : Staff인증 요청만 허용

    # IsAuthenticatedOrReadOnly : 인증이 안되어 있으면 읽기 권한만 허용

    # DjangoModelPermissons : 인증된 요청만 허용 + 장고 모델단위 권한 체크

    # DjangoModelPermissionsOrAnonReadOnly : DjangoModelPermissons 유사, 인증이 안되어 있으면 읽기 권한만 허용

    # DjangoObjectPermissons : 인증이 안되어 있으면 거부, 인증이 되어있으면 Object에 대한 권한 체크를 수행

)

 

# 기존에 있는 urlpatterns

 

if settings.DEBUG:

    urlpatterns += [

        re_path(r'^swagger(?P\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name="schema-json"),

        re_path(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),

        re_path(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc')

    ]

5. 실행화면

    - http://127.0.0.1:8000/swagger/

Swagger 실행화면

 

공식문서 : https://drf-yasg.readthedocs.io/en/stable/readme.html

728x90
반응형
LIST
728x90
반응형
SMALL
PyCharm을 통하여 Django App 및 Project를 생성하고,
App에 있는 views.py에 있는 함수를 실행했을 때, Error가 나는 경우 해결책

 

■ App을 만들어 사용하는 간단한 방법을 알아보자.

1. 아래 이미지는 Django Project와 App을 만들어놓은 상태이다.

Django Project, App이 추가된 화면

2. django_app_1/views.py에 새로운 url을 호출할 때 나올 함수를 선언하였다.

    django_project_1/django_project_1/urls.py에 django_app_1의 views를 import 한 이후에 path와 url을 추가하고, views.py에서 만든 함수를 연결하고 실행한다.

Path 추가하는 화면

3. 실행결과 Error : ModuleNotFoundError: No module named 'django_project_1.django_app_1'

    원인은 django_project_1안에 django_project_1라는 같은 이름의 Project가 있기 때문이다.

    이렇게 되면 경로를 찾을 수 없게 되는데, 에러 수정을 위해서는 같은 이름 중 하나는 수정해야 하므로, Project이름을 django_pro_1(원하는 이름)로 수정한다.

4. 수정방법은 이름을 바꾸고자 하는 Project에서 우클릭, Refactor, Rename을 클릭하면 Rename창이 뜬다.

    원하는 이름으로 수정하고 Refactor를 누른다. 그러면 하단에 수정될 파일 개수가 나오고, 확인 후 Do Refactor를 누르면 참조하고 있던 것들이 모두 수정된다.

Refactor하는 화면

5. 다시 실행하면 아래와 같이 실행된다.

App이 실행된 화면

6. 실행이 안될 경우, django_project_1(수정 후 명칭 : django_pro_1)/setting.py과 manage.py의 내용을 수정한다.

  - setting.py : ROOT_URLCONF = 'django_pro_1.urls' , WSGI_APPLICATION = 'django_pro_1.wsgi.application'

  - manage.py : django_pro_1.settings'

  위의 2개만 수정해도 당장은 실행되지만, asgi.py, wsgi.py도 수정을 해야 한다.

 

(참고) HttpResponse

- 간단하게 설명하자면 urls.py에서 정리된 Url을 요청(Request)하면 응답(Response)이 오는 구조인데, Request는 함수에 첫 번째 인자로 전달하고, Response는 HttpResponse 또는 JsonResponse로 전달받는다. 그렇기 때문에 별도로 Html파일을 만들지 않고도 페이지를 확인할 수 있다.

728x90
반응형
LIST
728x90
반응형
SMALL
Python, Django, Anaconda, PyCharm을 사용하여 프로젝트 구성하는 방법

 

■ Python, Django(프레임워크), Anaconda(가상환경 버전관리)를 사용하여 프로젝트를 만들기에 앞서, 이 3가지 프로그램이 설치가 되어 있지 않으면 먼저 설치하도록 한다. 설치 방법은 다음과 같다.

1. Python 다운로드 사이트 : https://www.python.org/downloads/

2. Download Python 3.11.3을 클릭, 설치 시 주의사항은 [Add Python.exe to PATH]에 체크를 꼭 해줘야 한다.

    체크를 해주지 않으면 환경변수가 추가되지 않아, Python을 실행할 때 항상 Python이 설치된 경로에 가서 실행해야만 하는 번거로움이 생긴다.

    실수로 체크를 하지 않았다면, 수동으로 추가하는 방법도 있으니, 다른 블로그를 참고하길 바란다.

Python 설치화면

3. Anaconda 다운로드 사이트 : https://www.anaconda.com/download/

4. Download 버튼을 클릭, 설치 시 주의사항은 [Add Anaconda3 to my PATH environment variable] 체크란인데,

    Python PATH를 설정하고 설치한 경우에는 경로 충돌이 일어날 수 있으므로, 아래 이미지와 같이 체크를 해제한 상태에서 설치를 진행해야 한다. 

Anaconda 설치화면

5. PyCharm 다운로드 사이트 : https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows

6. Community에 있는 다운로드를 클릭한다. 

PyCharm 다운로드 화면

7. PyCharm 설치 시 주의사항은 아래 이미지 옵션 체크 부분인데 기본적으로 모두 체크가 안되어 있지만, 전부 체크를 하고 설치를 진행하면 된다.

    PATH는 앞서 말했듯 환경변수에 대한 내용으로 꼭 체크를 하도록 한다.

PyCharm 설치화면

 설치가 완료되었으면, Python, Django(프레임워크), Anaconda(가상환경 버전관리)를 사용하여 프로젝트를 생성한다.

1. PyCharm 실행 후, New Project를 클릭하면, 아래 우측 이미지로 넘어가는데, Anaconda를 이용하여 가상환경 버전관리를 하기로 했으므로,

    New environment using을 Conda로 변경하고, 개발환경에 맞는 Python version을 선택한다.

    [Make available to all projects]는 다른 프로젝트에서도 이 가상환경을 사용하고 싶을 때 체크한다.

PyCharm 프로젝트 생성

2. 프로젝트를 생성했으면, 이제 장고를 설치한다. 아래 이미지 왼쪽 사각형안의 터미널을 클릭하고, 명령어를 입력한다.

    - Django 설치 명령어 : pip install django

초기 프로젝트 생성 화면

3. 장고 설치가 완료되었으면, 차례로 DjangoProject 및 DjangoApp을 생성한다.

    - DjangoProject 생성 명령어 : django-admin startproject django_project_1  (django_project_1 : 프로젝트 이름)

    - DjangoApp 생성 : manage.py를 사용하기 때문에 manage.py가 있는 경로로 맞춰줘야 한다.

    - 명령어 cd django_project_1을 입력, 경로가 변경된 걸 확인 후, 명령어 python manage.py startapp django_app_1 입력하여

      DjangoApp을 생성한다. (django_app_1 : 앱 이름)

4. 아래 이미지는 Django프로젝트 및 App이 생성된 화면이다.

Django Project, App이 생성된 화면

5. DjangoProject 실행 명령어 : python manage.py runserver

    - 실행하면 위에 이미지와 같이 http://127.0.0.1:8000/ 가 나오는 것을 볼 수 있다.

    - IP를 클릭해서 아래와 같은 이미지가 나오면 DjangoProject가 성공적으로 만들어진 것이다.

Django Project 실행화면

 

(참고) 명령어 python manage.py runserver를 치지 않고, 버튼클릭 한 번으로 실행하는 방법

- 아래 이미지 가장 상단에 main우측 ↓화살표 버튼 ☞ Edit Configurations...(아래 이미지에는 없음) ☞ 왼쪽 + 버튼 ☞ Script path 우측 폴더버튼

   을 클릭하여 manage.py를 찾아서 선택 ☞ Parameters : runserver 입력 ☞ 확인 ☞ main우측 ▷ 버튼을 눌러 실행

runserver 설정화면

 

728x90
반응형
LIST
728x90
반응형
SMALL

■ Django(장고)에 대한 설명

1. Python(파이썬)을 기반으로 한 웹 프레임워크이다.

2. Model(모델), Template(템플릿), View(뷰)로 구성된 MTV 패턴을 사용하고 있다. (MVC 패턴과 유사)

3. SQL을 사용하지 않고 Database에서 사용하는 테이블(RDBMS)을 자동으로 대응해 주는 ORM(Object-Relational Mapping)을 통하여 코드를 작성할 수 있다.

4. 많은 보안 기능을 내장하고 있어, 보안성이 우수하다.

5. 다양한 타사 패키지 및 플러그인을 지원한다.

6. 2023년 Laravel, Ruby on Rails에 이어 3위를 차지할 정도로 인기가 많은 프레임워크이다.

7. 대표적인 사이트의 예로 Instagram, JetBrains 등이 있다.


■ 장점

1. 설치가 간편하다.

2. 포럼, 블로그, 소셜 미디어 등 수많은 개발자 커뮤니티를 가지고 있어 검색 가능할만한 자료가 많다.

3. 다른 프레임워크보다 강력하고 많은 라이브러리를 사용할 수 있다. 그렇기 때문에, 많은 코딩 없이 프로그램을 완성시킬 수 있다. 초보자들도 다가가기 편한 프레임워크다.

4. IDE(통합 개발 환경)가 훌륭하다. (PyCharm, Visual Studio Code 등)

5. 프로젝트를 만들면 별도의 개발 없이 자동으로 관리자 화면을 제공한다.

6. App 단위로 구성이 되어 있어, 독립적으로 작업할 때 매우 쉽다.

7. ORM을 제공하기 때문에 쿼리 없이 데이터를 관리할 수 있다.

8. 많은 보안기능을 제공하고 있으며, 설정에도 매우 간편하다.

9. 웹 서버를 포함하고 있어서 개발과정에 별도로 웹서버가 없어도 된다.

10. 개발과정에서는 소스가 수정되면, 서버를 다시 시작하지 않아도 바로 적용이 된다.

11. Python을 기본으로 개발한다면, Python에서 제공하는 모든 기능을 활용할 수 있다. (Docker 구성 및 API 연계 등)


■ 단점

1. 자료는 많지만, 아직 한글 문서가 많은 편은 아니다.

2. 소형 프로젝트에는 사용하기 무겁고 기능이 많아 부적합하다.

3. 장점에도 소개되었지만, 내부에 구현된 기능이 많다는 것은 곧, 자유롭게 코딩할 수 있는데 한계가 있으므로, 코딩하는데 어려움을 겪을 수 도 있다. 또한 Django에서 문제가 생겼을 때, Python코딩으로 문제를 해결하는 경우가 발생할 수 있다.

4. ORM을 사용한다고 했을 때, 복잡한 데이터 구조(Join이 많은 경우)나 Procedure(프로시져)를 많이 사용한 곳에는 적합하지 않을 수 있다.

5. Python의 단점을 그대로 가져온다. (Python은 타입을 선언하지 않아도 실행되기에, 타입을 검사하려면 시간이 걸릴 수밖에 없다. 또한, 인터프리터 언어(한 줄씩 읽어 내려가며 실행하는 언어)이기 때문에 상대적으로 컴파일하는 프로그램보다 편하지만 빠르지는 않다.)


■ Django(장고)를 선택한 이유

1. Python에서 제공하는 모든 기능을 활용할 수 있다.

2. Django는 Python을 기반으로 만들어진 프레임워크이기 때문에, AI(인공지능) 개발에 유용하다.


728x90
반응형
LIST

+ Recent posts