본문 바로가기
기타

TIL - 22.02.15

by DGK 2022. 2. 16.

 

개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

2월 15일(화)

 

Django urls.py


Django Workflow

 

Django Workflow 예시

 

위의 Django Workflow는 Client의 HTTP request를 분석(urls.py)하여 요청을 처리하기 위한 로직(views.py)을 실행시키고, 데이터베이스와 통신(models.py)하여 데이터 작업을 수행한 후 요청(request)에 맞는 HTTP response를 Client에 보내주는 Backend API를 보여주고 있다. 

 

 

urls.py

Django project tree 구조 예시

 

  1. config 하부에 존재하는 urls.py는 main urls.py 혹은 부모 urls.py라고 한다.
  2. Django의 app 하부에 존재하는 urls.py를 app urls.py라고 한다.
  3. Django는 HTTP request를 통해 들어오는 URL을 부모 urls.py에서 분석하여 app urls.py로 넘겨주고, app urls.py는 해당 URL을 분석하여 request method에 맞는 views.py의 함수 또는 클래스로 맵핑시켜준다.

 

 

main urls.py & app urls.py

# main urls.py

from django.urls import path, include

urlpatterns = [
    path('owners', include('owners.urls')),
]

 

만약, HTTP request를 통해 들어온 URL이 " https://127.0.0.1:8000/owners/dogs "이면 main urls.py는 https://127.0.0.1:8000/owners 까지 해당 URL을 분석하고 이후의 path 값은 app urls.py로 넘겨준다.

 

 

# app urls.py

from django.urls import path
from owners.views import OwnersView, DogsView

urlpatterns = [
    path('', OwnersView.as_view()),    
    path('/dogs', DogsView.as_view()),
]

 

이후 app urls.py는 main urls.py로 부터 받은 URL의 나머지 부분(/dogs)을 분석하여, views.py의 존재하는 함수 혹은 클래스에 매칭시켜준다. 위의 예시(" https://127.0.0.1:8000/owners/dogs ")에서는 HTTP request 요청이 views.py의 DogsView 클래스에 매칭된다. 

 

참고로, as_view() 코드는 HTTP request의 method와 views.py의 class method를 맵핑시켜주는 역할을 한다.

따라서, views.py에서 class의 인스턴스 method를 만들 때에는 method명을 HTTP request method명과 일치시켜주는 것이 좋다. 

 

 

# views.py(참고)

class DogsView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            owner_info = Owner.objects.get(pk=data['owner_id'])
            Dog.objects.create(
                name     = data['dog_name'],
                age      = data['dog_age'],
                owner_id = owner_info.id
            )
            return JsonResponse({'message' : 'created'}, status=201)
        except KeyError:
            return JsonResponse({'message' : 'KeyError'}, status=400)
    
    def get(self, request):
        dogs = Dog.objects.all()
        results = []
        
        for dog in dogs:
            results.append(
                {
                    "name"       : dog.name,
                    "age"        : dog.age,
                    "owner_name" : dog.owner.name
                }
            )
        return JsonResponse({'results': results}, status=200)

 

 

'기타' 카테고리의 다른 글

TIL - 22.02.17  (0) 2022.02.17
TIL - 22.02.16  (0) 2022.02.16
TIL - 22.02.14  (0) 2022.02.14
TIL - 22.02.11  (0) 2022.02.11
TIL - 22.02.10  (0) 2022.02.10

댓글