-
JSON Response와 SerializationDjango 2024. 9. 1. 06:05
JSON Response
🤔 조회를 하려면 데이터가 필요하다.
매번 create하는 것도 너무 힘들고, 자동으로 많이 생성해주는 거 뭐 없을까? 이때 편리하게 쓸 수 있는게 바로 Django Seed!
Django Seed
- Github : **https://github.com/Brobin/django-seed**
- Django-seed uses the faker library to generate test data for your Django models.
- Django-seed allows you to write code to generate models, and seed your database with one simple manage.py command! </aside>
데이터 생성하기
install & freeze
pip install django-seed
pip freeze > requirements.txt
settings.py
INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", # Third-party "django_seed", # Local "articles", ]
seeding
python manage.py seed articles --number=30
만약, 이런 에러가 나면? → ModuleNotFoundError: No module named 'psycopg2'
pip install psycopg2
근데 난 psycopg2를 설치했는데도 또 이런 에러가 났다...😡
그래서 해결 방법은
이걸 설치한 다음
pip install psycopg2-binary
다시 해주면
python manage.py seed articles --number=30
잘 나온다. 휴😮💨
SQLite 켜서 확인해보면 데이터가 잘 만들어진 걸 확인할 수 있다.
Response 만들기
HTML Response - urls
from django.urls import path from . import views app_name = "articles" urlpatterns = [ path("html/", views.article_list_html, name="article_list_html"), ]
HTML Response - views
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)
HTML Response - templates
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>API PJT</title> </head> <body> <h1>Article List</h1> <hr><br> {% for article in articles %} <h3>title: {{ article.title }}</h2> <p>content: {{ article.content }}</p> <p>created_at: {{ article.created_at }}</p> <p>updated_at: {{ article.updated_at }}</p> <hr> {% endfor %} </body> </html>
Json Response 01 - urls
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"), ]
Json Response 01 - views
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
- JSON으로 인코딩된 response를 만드는 HttpResponse의 서브클래스다.
- safe → dict타입이 아닌 객체를 직렬화(Serialization)하기 위해서는 False로 설정해야 한다.
🤔 Serialization란?
- 객체 또는 데이터 구조를 저장, 전송하기 위해 다른 포맷으로 변경하는 것 → 데이터의 구조는 유지하면서 추후 재구성이 가능한 포맷으로 변환
- 현재 Python 객체 형태인 Queryset 혹은 Model의 Instance를 전송 가능한 형태로 직렬화를 통해 JSON, XML, YAML 등의 형태로 변환하는 것
- Django도 내부적으로 다른 데이터 포맷으로 쉽게 직렬화 할 수 있는 기능을 제공한다.
urls
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"), ]
views
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")
서버 연결해보면 모두 잘 반영되서 보여진다.
http://127.0.0.1:8000/api/v1/articles/html/
http://127.0.0.1:8000/api/v1/articles/json-01/
http://127.0.0.1:8000/api/v1/articles/json-02/
🤔 만약, 이렇게 보이지 않는다면
→ Chrome extension에 JSON viewer를 추가해주면 된다.
https://chromewebstore.google.com/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh?hl=ko
✅ Django는 위와 같이 내부적으로 serializer를 제공하지만 모델 구조에 한정된 구조
- 직렬화된 데이터의 구조를 변경하거나 새로운 필드를 구성하는 것에 많은 추가 작업이 필요하다.
- 유연한 API를 위한 기능이라기보다 모델 구조로 저장되어있는 데이터를 export 하는 용도에 가깝다.
'Django' 카테고리의 다른 글
Python Django 기초 시험 오답노트 (1) 2024.09.02 Django REST Framework, Postman (3) 2024.09.01 HTTP와 URL구조 (1) 2024.08.29 Django Model Relationship (M:N) (0) 2024.08.27 Django Custom UserModel (0) 2024.08.19