ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSON Response와 Serialization
    Django 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 extensionJSON viewer를 추가해주면 된다.

    https://chromewebstore.google.com/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh?hl=ko

     

    JSON Viewer - Chrome 웹 스토어

    The most beautiful and customizable JSON/JSONP highlighter that your eyes have ever seen. Open source at https://goo.gl/fmphc7

    chromewebstore.google.com

     


     

     

    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
Designed by Tistory.