카테고리 없음

Response와 Serializer

이훈히 2024. 4. 24. 14:25

상위 디렉토리 이동 방법 
cd ..

venv생성
python -m venv venv

가상환경 활성화 
source venv/Scripts/activate

장고설치 
pip install django==4.2

설치한 앱목록 requirements.txt 파일로 저장 
pip freeze > requirements.txt

requirements.txt 파일 읽어오기 
pip install -r requirements.txt

프로젝트 만들기 
django-admin startproject <프로젝트 이름> . 


앱만들기 
python manage.py startapp <앱 이름>

`INSTALLED_APPS` 부분에 현재 우리 프로젝트에 등록된 app목록이 보입니다.

이 곳에 우리가 생성한 앱을 등록하면 됩니다. 앱이나 서드파티는 설치나 생성 후 등록이 필요 ! 

 

 

 

**장고 시드(Django Seed)**는 장고(Django) 프로젝트의 데이터베이스에 샘플 데이터를 생성하고 삽입하는 데 사용되는 라이브러리입니다. 개발 과정에서 데이터베이스를 테스트하거나 데모 목적으로 사용되는 데이터를 빠르게 생성할 수 있도록 돕습니다.

주요 기능

  1. 모델 필드 자동 감지: Django Seed는 모델의 필드 유형을 자동으로 감지하여 적절한 데이터를 생성합니다. 예를 들어, 문자열 필드에는 무작위 텍스트가, 날짜 필드에는 무작위 날짜가 생성됩니다.
  2. 커스텀 데이터 생성: 사용자는 각 모델 필드에 대해 특정 데이터 생성 규칙을 정의할 수 있습니다. 이를 통해 특정 필드에 특별한 형식의 데이터를 삽입할 수 있습니다.
  3. 명령줄 인터페이스: Django Seed는 Django의 manage.py 스크립트를 통해 사용할 수 있는 명령줄 도구를 제공합니다. 이를 통해 개발자는 명령줄에서 직접 데이터베이스에 데이터를 삽입할 수 있습니다.
사용 방법
Django Seed를 사용하기 위해서는 먼저 패키지를 설치해야 합니다. pip를 사용하여 설치할 수 있습니다:

bash
pip install django-seed
설치 후, Django의 INSTALLED_APPS 설정에 django_seed를 추가해야 합니다:

python

INSTALLED_APPS = (
    ...
    'django_seed',
)
데이터 시딩
모델에 데이터를 시딩하는 기본 명령은 다음과 같습니다. 
예를 들어, myapp 내의 MyModel 모델에 대해 10개의 레코드를 생성하려면:

bash
python manage.py seed myapp --number=10

 

혹시 이런 에러가 나신다면
ModuleNotFoundError: No module named 'psycopg2'

pip install psycopg2

 

Response 만들기 (1)

from django.urls import path
from . import views

app_name = "articles"
urlpatterns = [
    path("html/", views.article_list_html, name="article_list_html"),
]

################################################################################
from django.shortcuts import render
from .models import Article


def article_list_html(request):
    articles = Article.objects.all()
    context = {"articles": articles}
    return render(request, "articles/articles.html", context)
############################################################################
< !DOCTYPE html >
< html lang = "ko" >
< head >
< meta
charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > Document < / title >
< / head >
< body >

< h2 > Article
list < / h2 >
< hr > < br >
{ %
for articles in article %}
< h3 > 제목
{{articles.title}} < / h3 >
< p > 내용
{{articles.content}} < / p >
< p > 생성일
{{articles.create_at}} < / p >
< p > 업데이트
{{articles.update_at}} < / p >
< hr >
{ % endfor %}

< / body >
< / html >

 

저번 프로젝트를 하며 계속 해왔던 방식 urls , views, html 만들어서 Article 모델 전송해서 출력하기 

 

Respone 만들기 2 

from django.urls import path
from . import views

app_name = "articles"
urlpatterns = [
    path("html/", views.article_list_html, name="article_list_html"),
    path("json-01/", views.json_01, name="json_01"),
    ]
################################################################
from django.http import  JsonResponse
def json_01(request):
    articles = Article.objects.all()
    json_res = []

    for article in articles:
        json_res.append(
            {
                "title": article.title,
                "content": article.content,
                "created_at": article.created_at,
                "updated_at": article.updated_at,
            }
        )

    return JsonResponse(json_res, safe=False)

 

장고에 있는 JsonResponse 이용하기 

  • JsonResponse
    • JSON으로 인코딩된 response를 만드는 HttpResponse의 서브 클래스입니다.
    • safe
    • → dict 타입이 아닌 객체를 직렬화(Serialization)하기 위해서는 False로 설정해야함

 

 

Respone 만들기 3

 

직렬화(Serialization)는 데이터 구조나 객체 상태를 저장하거나 전송할 수 있는 형태로 변환하는 과정을 말합니다. 이 과정을 통해 프로그램이 실행 중인 데이터를 파일에 저장하거나, 네트워크를 통해 다른 컴퓨터로 전송할 수 있게 됩니다. 직렬화된 데이터는 필요에 따라 다시 원래의 형태로 복원(역직렬화, Deserialization)될 수 있습니다.

직렬화의 주요 목적:

  1. 영속성(Persistence): 객체의 상태를 영구적으로 저장하여 나중에 다시 사용할 수 있게 합니다. 이를 통해 애플리케이션을 종료해도 데이터를 잃지 않고 재사용할 수 있습니다.
  2. 네트워크 통신: 객체를 네트워크를 통해 다른 시스템으로 전송하려면 바이트 형태로 변환해야 합니다. 직렬화는 객체를 네트워크 전송에 적합한 형태로 만들어 줍니다.
  3. 데이터 분산: 분산 시스템에서는 서로 다른 네트워크 노드 간에 데이터를 교환해야 할 필요가 있습니다. 직렬화는 데이터를 표준 포맷으로 변환하여 다양한 시스템 간의 호환성을 보장합니다.

직렬화 기술의 예:

  • JSON (JavaScript Object Notation): 텍스트 기반의 경량 데이터 교환 포맷으로, 인간이 읽을 수 있는 텍스트를 사용하여 데이터 객체를 표현합니다. 웹 애플리케이션에서 클라이언트와 서버 간 데이터 전송에 널리 사용됩니다.
from django.urls import path
from . import views

app_name = "articles"
urlpatterns = [
    path("html/", views.article_list_html, name="article_list_html"),
    path("json-01/", views.json_01, name="json_01"),
    path("json-02/", views.json_02, name="json_02"),
]
######################################################################
from django.core import serializers

def json_02(request):
    articles = Article.objects.all()
    res_data = serializers.serialize("json", articles)
    return HttpResponse(res_data, content_type="application/json")

 

 

Django는 위와 같이 내부적으로 serializer를 제공하지만 모델 구조에 한정된 구조

  • 직렬화된 데이터의 구조를 변경하거나 새로운 필드를 구성하는 것에 많은 추가 작업이 필요합니다.
  • 유연한 API를 위한 기능이라기보다 모델 구조로 저장되어있는 데이터를 export(꺼내오는,복원) 하는 용도에 가깝습니다.

ex) 저는 title 과 content 만 필요해서 그것만 보내주세요 ~ 

 

⇒ 모델에 종속적이지 않고 유연하지만 사용하기 편한 Serializer의 필요성!