WebFramework/[Django]
-
[Django] APIView CRUD 예제 코드 2023.08.23
-
[Django] Serializer에 List 정의하기 2023.08.23
-
[Django] extends와 include 2023.07.26
-
[Django] docker-Django 접속하기 2023.07.11
[Django] APIView CRUD 예제 코드
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Item
from .serializers import ItemSerializer
class ItemListView(APIView):
def get(self, request):
items = Item.objects.all()
serializer = ItemSerializer(items, many=True)
return Response(serializer.data)
def post(self, request):
serializer = ItemSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ItemDetailView(APIView):
def get_object(self, pk):
try:
return Item.objects.get(pk=pk) # 주어진 pk로 Item 객체를 가져오는 메소드
except Item.DoesNotExist:
raise status.HTTP_404_NOT_FOUND # Item이 없을 때 404 에러 반환
def get(self, request, pk):
item = self.get_object(pk) # get_object 메소드로 Item 객체 가져오기
serializer = ItemSerializer(item)
return Response(serializer.data)
def put(self, request, pk):
item = self.get_object(pk) # get_object 메소드로 Item 객체 가져오기
serializer = ItemSerializer(item, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
item = self.get_object(pk) # get_object 메소드로 Item 객체 가져오기
item.delete() # 해당 Item 객체 삭제
return Response(status=status.HTTP_204_NO_CONTENT)
# urls.py
from django.urls import path
from .views import ItemListView, ItemDetailView
urlpatterns = [
path('items/', ItemListView.as_view(), name='item-list'),
path('items/<int:pk>/', ItemDetailView.as_view(), name='item-detail'),
]
'WebFramework > [Django]' 카테고리의 다른 글
[Django] Serializer에 List 정의하기 (0) | 2023.08.23 |
---|---|
[Django] extends와 include (0) | 2023.07.26 |
[Django] Class Based View, Funtion Based View (0) | 2023.07.24 |
[Django] docker-Django 접속하기 (0) | 2023.07.11 |
[Django] Serializer에 List 정의하기
# my_serializer.py
from rest_framework import serializers
from 모델 경로 import myModel
class ListSerializer(serializers.Serializer):
myIds = serializers.ListField(child=serializers.CharField())
# my_view.py
from rest_framework.views import APIView
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi
class MyView(APIView):
@swagger_auto_schema(
request_body=openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'myId_list':openapi.Schema(
type=openapi.TYPE_ARRAY,
items=openapi.Schema(type=openapi.TYPE_STRING)
)
}
)
)
def post(self, request):
return myService.myRest(request)
# my_service.py
def myRest(request):
myId_list = request.data.get('myId_list')
serializer = MySerializer(data={'myIds':myId_list})
if serializer.is_valid():
return Response({'message': msg}, status=status.HTTP_400_BAD_REQUEST)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
'WebFramework > [Django]' 카테고리의 다른 글
[Django] APIView CRUD 예제 코드 (0) | 2023.08.23 |
---|---|
[Django] extends와 include (0) | 2023.07.26 |
[Django] Class Based View, Funtion Based View (0) | 2023.07.24 |
[Django] docker-Django 접속하기 (0) | 2023.07.11 |
[Django] extends와 include
Django 템플릿 시스템에서 사용되는 두 가지 기능을 정리하고자 한다.
💡 extends
extends는 장고의 템플릿 상속 기능을 나타낸다.
이 기능을 사용하면 기본 템플릿(부모 템플릿)을 만들고,
이를 확장하여 추가적인 내용을 포함하는 템플릿(자식 템플릿)을 만들 수 있다.
이를 통해 템플릿의 재사용성을 높이고 코드의 중복을 방지할 수 있다.
<!-- 부모 템플릿 -->
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}기본 제목{% endblock %}</title>
</head>
<body>
<div class="container">
{% block content %}
{% endblock %}
</div>
</body>
</html>
<!-- 자식 템플릿 -->
{% extends "base.html" %}
{% block title %}확장된 제목{% endblock %}
{% block content %}
<h1>확장 템플릿</h1>
<p>기본 템플릿을 확장한 내용</p>
{% endblock %}
자식 템플릿은 extends를 사용해 기본 템플릿을 상속하고,
{% block %} 태그를 통해 기본 템플릿의 블록을 재정의하거나 새로운 블록을 추가할 수 있다.
💡 include
include는 다른 템플릿 파일을 현재 템플릿에 포함시키는 기능이다.
이를 사용해 템플릿 파일의 재사용성을 높일 수 있으며,
특정 부분을 별도의 템플릿 파일로 분리하여 코드를 조직화할 수 있다.
예를 들어, 반복되는 HTML 코드를 별도의 템플릿 파일로 분리하고,
여러 곳에서 이를 재사용하고자 할 때 사용할 수 있다.
<!-- 반복되는 템플릿 파일 (sub_template.html) -->
<div class="item">
<h2>{{ title }}</h2>
<p>{{ content }}</p>
</div>
<!-- 메인 템플릿 파일 -->
<!DOCTYPE html>
<html>
<head>
<title>메인 페이지</title>
</head>
<body>
<div class="container">
{% for item in items %}
{% include 'sub_template.html' with title=item.title content=item.content %}
{% endfor %}
</div>
</body>
</html>
include는 {% include %} 태그를 사용하여 다른 템플릿 파일을 포함하며,
필요에 따라 추가적인 데이터를 넘겨줄 수도 있다.
'WebFramework > [Django]' 카테고리의 다른 글
[Django] APIView CRUD 예제 코드 (0) | 2023.08.23 |
---|---|
[Django] Serializer에 List 정의하기 (0) | 2023.08.23 |
[Django] Class Based View, Funtion Based View (0) | 2023.07.24 |
[Django] docker-Django 접속하기 (0) | 2023.07.11 |
[Django] Class Based View, Funtion Based View
💡 CBV
Django에서는 클래스 기반 뷰 (Class Based View)를 사용해
일반적인 웹 개발 작업을 보다 쉽고 구조화된 방식으로 처리할 수 있다.
이러한 CBV는 'View'를 직접 상속받을 수도 있지만,
Django에서는 뷰의 특정 기능을 더 간편하게 구현할 수 있도록 다양한 CBV를 제공한다.
각 뷰를 비교해 보자.
View 클래스
기본적인 HTTP 메서드(GET, POST, PUT, DELETE 등)에 대한 처리를 직접 구현해야 함
모든 동작을 직접 제어하고자 할 때 사용
매우 유연하지만 기본 동작들을 모두 직접 구현해야 하므로 코드 양이 많아질 수 있음
1. 필요한 HTTP메서드에 해당하는 메서드를 오버라이딩
2. 뷰에서 필요로 하는 데이터를 가져와 템플릿으로 전달
3. 원하는 템플릿 파일을 렌더링하여 HTTP 응답으로 반환
from django.http import HttpResponse
from django.views.generic import View
class MyView(View):
def get(self, request):
# GET 요청에 대한 처리를 여기에 작성합니다.
return HttpResponse("This is a GET request")
def post(self, request):
# POST 요청에 대한 처리를 여기에 작성합니다.
return HttpResponse("This is a POST request")
ListView 클래스
데이터 목록을 보여주는 뷰에 사용
데이터베이스에서 쿼리셋을 가져와 템플릿으로 전달하는 작업을 간편하게 처리
목록 페이지를 렌더링하는 데 필요한 기능들이 이미 구현되어 있음
DetailView 클래스
단일 데이터의 상세 정보를 보여주는 뷰에 사용
특정 데이터를 데이터베이스에서 가져와 템플릿으로 전달하는 작업을 간편하게 처리
상세 정보 페이지를 렌더링하는 데 필요한 기능들이 이미 구현되어 있음
CreateView, UpdateView, DeleteView 등
데이터의 생성, 수정, 삭제를 처리하는 뷰에 사용
form을 사용하여 데이터를 입력하고 데이터베이스에 저장하는 작업을 간편하게 처리
각가의 기능에 필요한 동작들이 이미 구현되어 있음
💡 FBV
Function Based View를 사용해 뷰를 구현할 수도 있다.
FBV는 단순한 함수로 뷰를 구현하는 방식이다.
간단하고 직관적인 방식으로 뷰를 구현할 수 있기 때문에 쉽게 접근할 수 있다.
뷰를 함수로 정의하고, 해당 함수에서 요청 (request)을 처리하고 응답 (response)을 반환하는 방식이다.
from django.http import HttpResponse
def my_view(request):
# 요청에 대한 처리를 여기에 작성합니다.
return HttpResponse("This is a function-based view")
위 예제 코드에서 볼 수 있듯
FBV는 요청(request) 객체를 인자로 받는 기반으로 동작한다.
Django에서 FBV를 작성할 때, 뷰 함수는 반드시 최소한 하나의 인자로 'request' 객체를 받아야 한다.
'request' 객체는 웹 요청에 대한 정보를 담고 있으며,
클라이언트로부터 서버로 전달된 데이터, 세션 정보, 사용자 정보 등을 포함한다.
'WebFramework > [Django]' 카테고리의 다른 글
[Django] APIView CRUD 예제 코드 (0) | 2023.08.23 |
---|---|
[Django] Serializer에 List 정의하기 (0) | 2023.08.23 |
[Django] extends와 include (0) | 2023.07.26 |
[Django] docker-Django 접속하기 (0) | 2023.07.11 |
[Django] docker-Django 접속하기
개발 환경
python3.8을 컨테이너로 올린 후 컨테이너 내부에 Django 설치해 사용
10100:8000으로 포트 포워딩
개발 서버 구동 후 접속
기본적으로 프로젝트를 생성 후 아래 명령어를 통해 개발 서버를 구동한다.
python manage.py runver
이에 대한 출력은 아래와 같다.
127.0.0.1:8000으로 접속하면 웹 사이트에 접속할 수 있다.
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
April 02, 2022 - 10:13:10
Django version 4.0.3, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
나는 python을 컨테이너로 올리고 10100 포트를 사용해야하므로
localhost:10100으로 접속했다.
하지만 웹 사이트에 접속하니 정상 실행이 되지 않는다!
Django는 기본적으로 개발 서버를 실행할 때 localhost만을 수신 대상으로 설정한다.
보안상의 이유로 기본적으로 외부로부터의 요청을 수신하지 않도록 설계되었다.
따라서 포트 포워딩을 통해 내가 보낸 요청이 컨테이너까지는 전달이 됐지만
컨테이너 내부의 localhost(루프백 인터페이스)와 포트 포워딩된 호스트의 10100포트 간의
통신이 이루어지지 않은 것이다.
이를 해결하기 위해 Django의 runserver 명령을 실행할 때
IP주소를 0.0.0.0으로 지정하여 외부 인터페이스에서의 요청을 수신할 수 있도록 설정하면 된다.
python manage.py runserver 0.0.0.0:8000
위 명령어로 서버를 실행시키고
localhost:10100으로 접속 시 정상 작동 한다.
'WebFramework > [Django]' 카테고리의 다른 글
[Django] APIView CRUD 예제 코드 (0) | 2023.08.23 |
---|---|
[Django] Serializer에 List 정의하기 (0) | 2023.08.23 |
[Django] extends와 include (0) | 2023.07.26 |
[Django] Class Based View, Funtion Based View (0) | 2023.07.24 |