Как отобразить данные JSON в правильном формате по запросу GET - PullRequest
0 голосов
/ 11 марта 2019

Я создал небольшой API в django и Python. Я читаю данные из URL (удаленный API) и сохраняю их в базу данных при выполнении запроса GET. Все выглядит хорошо, и я показываю те же данные на конечной точке моего сервера. Но они отображаются в нечитаемом формате.

Пожалуйста, обратитесь к приведенному ниже коду view.py:

from rest_framework import generics
from customer.models import Customers
from .serializers import CustomersSerializer, CustomersKeySerializer
import json
import urllib.request
import pyodbc
from django.http import HttpResponse, JsonResponse

def customer_get(request):
    j = urllib.request.urlopen("https://web.njit.edu/~jsd38/json/customer.json")
    customer_data = json.load(j)
    cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=DAL1281;"
                      "Database=Test;"
                      "Trusted_Connection=yes;")
    cursor = cnxn.cursor()
    cursor.execute("SELECT CustomerId FROM dbo.Customers")
    CustomerIdRows = [x[0] for x in cursor.fetchall()]

    CustomerIds = Customers.objects.values_list('CustomerId', flat=True)

    for customer in customer_data:
        CustomerId = customer["@Id"]
        Name = customer["Name"]
        PhoneNumber = customer["PhoneNumber"]
        EmailAddress = customer["EmailAddress"]
        StreetLine = customer["Address"]["StreetLine1"]
        City = customer["Address"]["City"]
        StateCode = customer["Address"]["StateCode"]
        PostalCode = customer["Address"]["PostalCode"]

        if int(CustomerId) not in CustomerIds:
            cus = Customers()
            cus.CustomerId = CustomerId
            cus.Name = Name
            cus.PhoneNumber = PhoneNumber
            cus.EmailAddress = EmailAddress
            cus.StreetLine = StreetLine
            cus.City = City
            cus.StateCode = StateCode
            cus.PostalCode = PostalCode
            cus.save()

        if int(CustomerId) not in CustomerIdRows:
            cursor.execute(
            "INSERT INTO dbo.Customers(CustomerId,Name,EmailAddress,StreetLine,City,StateCode,PostalCode) VALUES (?,?,?,?,?,?,?)",
            (CustomerId,Name,EmailAddress,StreetLine,City,StateCode,PostalCode))
        cnxn.commit()
    queryset = Customers.objects.all()
    serializer_class = CustomersSerializer
    return HttpResponse(customer_data)

enter image description here

1 Ответ

0 голосов
/ 11 марта 2019

Django Rest Framework предоставляет Response вместо HttpResponse для рендеринга данных JSON, как вы и планировали.

используйте их так:

...
return Response(customer_data)

и импортируйте их отсюда: from rest_framework.response import Response

Некоторые советы по программированию:

Я видел ваш код, и я думаю, что вы можете сделать его намного чище и более читабельным, а также сократить избыточные разделы следующим образом:

  • используйте setattr для назначения предметов.например, setattr(cus, 'Name', nameValue)

  • получить значение ключа json следующим образом: customer.get('EmailAddress', ''), С помощью этого метода, если в этом json нет ключа для EmailAddress, по крайней мере, вы можете установитьзначение по умолчанию, в противном случае произойдет исключение!

  • использовать django orm и соединение db.Не думаю, что в 2019 году было бы круто использовать RAW запросов :).Кстати, ваш код уязвим для SQL-инъекции , потому что вы сразу передаете неподтвержденные данные из внешнего json API в запрос к вашей базе данных.Я не предлагаю, чтобы в ALL .

  • Избегайте записи переменной, которая никогда не использовалась.Например serializer_class.Также я предлагаю сделать ответ из вашей базы данных.например return Response(serializer_class(many=True).to_representation(queryset)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...