Я не понимаю, откуда в ответе сервера появляются косые черты в json - PullRequest
0 голосов
/ 26 декабря 2018

В основной функции я вызываю функцию, в которой вызывается другое приложение, в результате я получаю данные в формате json.Но я не понимаю, откуда появляются косые черты перед каждой двойной кавычкой "

в браузере, я вижу данные с кавычками Пример: {\"192.168.43.1\":[\"53\":{\"state\":\"open\"...

Если я не отправляю данные, а записываю в файл, данные записываются в файл БЕЗ косых черт Пример: {"192.168.43.1":["53":{"state":"open"...

Это нормально? Как удалить косые черты? Этоданные должны принять другое приложение и десериализовать их.

def get_ip(ip, port):
   return os.system("some_app")

@hug.get('/scan')
def main(ip: hug.types.text, port: hug.types.text):
    json = get_ip(ip, port)

    #JUST FOR TEST WITH PARAM safe=False                                                
    return JsonResponse("{\"192.168.1.1\":[\"80\":{\"state\":\"open\",\"reason\":\"syn-ack\",\"name\":\"http\",\"product\":\"\"}]}", safe=False)

Ошибки без параметра safe = False:

Traceback (most recent call last):
 File "/usr/lib/python3.6/wsgiref/handlers.py", line 137, in run
 self.result = application(self.environ, self.start_response)
 File "/usr/local/lib/python3.6/dist-packages/falcon/api.py", line 244, in __call__
responder(req, resp, **params)
File "/usr/local/lib/python3.6/dist-packages/hug/interface.py", line 793, in __call__
raise exception
File "/usr/local/lib/python3.6/dist-packages/hug/interface.py", line 766, in __call__
self.render_content(self.call_function(input_parameters), context, request, response, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/hug/interface.py", line 703, in call_function
return self.interface(**parameters)
 File "/usr/local/lib/python3.6/dist-packages/hug/interface.py", line 100, in __call__
return __hug_internal_self._function(*args, **kwargs)
File "script.py", line 181, in main
return JsonResponse("{\"192.168.1.1\":[\"80\":{\"state\":\"open\",\"reason\":\"syn-ack\",\"name\":\"http\",\"product\":\"\"}]}")
File "/usr/local/lib/python3.6/dist-packages/django/http/response.py", line 552, in __init__
'In order to allow non-dict objects to be serialized set the '
TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False.

Ошибки с параметром safe = False :

return JsonResponse("{\"192.168.1.1\":[\"80\":{\"state\":\"open\",\"reason\":\"syn-ack\",\"name\":\"http\",\"product\":\"\"}]}", safe=False)


 File "/usr/lib/python3.6/wsgiref/handlers.py", line 137, in run
self.result = application(self.environ, self.start_response)
 File "/usr/local/lib/python3.6/dist-packages/falcon/api.py", line 244, in __call__
responder(req, resp, **params)
File "/usr/local/lib/python3.6/dist-packages/hug/interface.py", line 793, in __call__
raise exception
File "/usr/local/lib/python3.6/dist-packages/hug/interface.py", line 766, in __call__
self.render_content(self.call_function(input_parameters), context, request, response, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/hug/interface.py", line 703, in call_function
return self.interface(**parameters)
File "/usr/local/lib/python3.6/dist-packages/hug/interface.py", line 100, in __call__
return __hug_internal_self._function(*args, **kwargs)
File "script.py", line 181, in main
return JsonResponse("{\"192.168.1.1\":[\"80\":{\"state\":\"open\",\"reason\":\"syn-ack\",\"name\":\"http\",\"product\":\"\"}]}", safe=False)
File "/usr/local/lib/python3.6/dist-packages/django/http/response.py", line 559, in __init__
super().__init__(content=data, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/django/http/response.py", line 291, in __init__
self.content = content
File "/usr/local/lib/python3.6/dist-packages/django/http/response.py", line 321, in content
content = self.make_bytes(value)
File "/usr/local/lib/python3.6/dist-packages/django/http/response.py", line 236, in make_bytes
return bytes(value.encode(self.charset))
File "/usr/local/lib/python3.6/dist-packages/django/http/response.py", line 85, in charset
return settings.DEFAULT_CHARSET
File "/usr/local/lib/python3.6/dist-packages/django/conf/__init__.py", line 57, in __getattr__
self._setup(name)
File "/usr/local/lib/python3.6/dist-packages/django/conf/__init__.py", line 42, in _setup
% (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting 
DEFAULT_CHARSET, but settings are not configured. You must either define the 
environment variable DJANGO_SETTINGS_MODULE or call settings.configure() 
before accessing settings.

1 Ответ

0 голосов
/ 26 декабря 2018

Ваш return "result {json}" вернет строковое значение, которое содержит json.Поскольку возвращаемое значение является строкой, браузер отображает дополнительные обратные слеши для правильной обработки двойных кавычек.

Чтобы решить эту проблему, вы можете обработать строковый ответ на стороне клиента и извлечь значения json из строки.

JSON.parse(response);

Но поскольку другое приложение ожидает формат json, вам лучше использовать JsonResponse, чтобы убедиться, что возвращаемый ответ - не строка, а формат json

from django.http import JsonResponse
return JsonResponse(json)
...