개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
2월 15일(화)
Django urls.py
Django Workflow
위의 Django Workflow는 Client의 HTTP request를 분석(urls.py)하여 요청을 처리하기 위한 로직(views.py)을 실행시키고, 데이터베이스와 통신(models.py)하여 데이터 작업을 수행한 후 요청(request)에 맞는 HTTP response를 Client에 보내주는 Backend API를 보여주고 있다.
urls.py
- config 하부에 존재하는 urls.py는 main urls.py 혹은 부모 urls.py라고 한다.
- Django의 app 하부에 존재하는 urls.py를 app urls.py라고 한다.
- 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 |
댓글