2014-09-18 3 views
0

Привет, я очень новичок в использовании вихревой системы как backend с fanytree в качестве переднего конца.Fancytree жалуется, что запрос Ajax возвратил строку с использованием Cherrypy

вот моя fanytree сторона кода:

source: { 
    url : '/test_data' 
}, 

на CherryPy стороне, я реализовал функцию под названием test_data

@cherrypy.expose 
@cherrypy.tools.json_out() 
def test_data(self, **kwargs): 
    cherrypy.response.headers["Content-Type"] = "application/json" 
    return '[ {"title":"abc", "folder": true, "key": "1", "children":[ {"title":"b","key":"2"}] }]' 

Так я вижу запрос приходит к CherryPy в

'GET /test_data?_=some number... 

В браузере я вижу возвращаемый объект обратно, но он не прошел проверку:

if (typeof data === "string") { 
     $.error("Ajax request returned a string (did you get the JSON dataType wrong?)."); 
} 

Я где-то читал, что вам нужен контент-тип, который будет json, но у меня уже есть. Что мне не хватает?

+0

Проверьте, что возвращает сервер, включая тип контента – jwalker

ответ

1

CherryPy JSON выход инструмент, cherrypy.tools.json_out, заботится о MIME и превратить ваши данные в Строка JSON. Так что если вы используете его метод должен выглядеть следующим образом:

@cherrypy.expose 
@cherrypy.tools.json_out() 
def test_data(self, **kwargs): 
    return [{ 
    "title" : "abc", 
    "folder" : True, 
    "key"  : 1, 
    "children" : [{"title": "b", "key": 2}] 
    }] 

В противном случае, если вы хотите сделать это самостоятельно, это будет:

import json 

@cherrypy.expose 
def test_data(self, **kwargs): 
    cherrypy.response.headers["Content-Type"] = "application/json" 
    return json.dumps([{ 
    "title" : "abc", 
    "folder" : True, 
    "key"  : 1, 
    "children" : [{"title": "b", "key": 2}] 
    }]) 

Затем убедитесь, что вы перезапустить приложение CherryPy, и смотреть в инструментах веб-разработчика или вкладке сети FireBug для проверки заголовков ответов и контента.

+0

Это именно то, что мне нужно. История заключается в том, что если я укажу @ cherrypy.tools.json_out(), мне придется возвращать список python, не могу использовать '' 'вокруг возврата, поскольку он будет обрабатываться как строка. Конечно, @ mar10 также исправил, что лучше построить в dicts, чтобы избежать такой проблемы. – user2426361

1

Тип содержимого в порядке, но возвращаемая строка недействительна json (например, ключи должны быть заключены в двойные кавычки). Я бы рекомендовал подготовить ваши данные в виде списка dicts, а затем использовать 'json.dumps()' для преобразования в JSON. (Может быть, инструмент json_out делает то же самое, но я предположил бы, что даже тогда вы должны возвращать список dicts вместо строки.)

+0

Хорошо, я изменил, как вы сказали, у fancytree все еще есть те же жалобы. – user2426361

+0

Строка, которую вы возвращаете в свой образец, определенно недействительна JSON (даже не действительный Python, кстати.) – mar10

+0

Хорошо, я отредактировал исходное сообщение, чтобы отразить это предложение. Но fancytree по-прежнему считает, что это строковый тип, а не объект json. – user2426361