2013-10-14 5 views
2

В flask-restful Я создал простой get, который возвращает список записей в JSON.Почему возвращенный JSON понимается как unicode вместо списка?

resource_fields = { 
      'record_date': fields.String, 
      'rating': fields.Integer, 
      'notes': fields.String, 
      'last_updated': fields.DateTime, 
     } 

class Records(Resource): 
def get(self, email, password, last_sync_date): 
    user, em_login_provider = Rest_auth.authenticate(email, password) 
    resource_fields = { 
     'record_date': fields.String, 
     'rating': fields.Integer, 
     'notes': fields.String, 
     'last_updated': fields.DateTime, 
    } 
    m_records = [] 
    if user: 
     try: 
      date = parser.parse(last_sync_date) 
     except: 
      #Never synced before - get all 
      recordsdb = Record.query(Record.user == user.key) 
      for record in recordsdb: 
       m_record = marshal(record, resource_fields); 
       m_records.append(m_record); 
      return json.dumps(m_records) 
    return {'data': 'none'} 

Сейчас в тестовом модуле, после загрузки полученной строки в JSON парсер, я все еще получаю Юникод.

Как это:

[ 
    { 
     "rating": 1, 
     "notes": null, 
     "last_updated": "Mon, 14 Oct 2013 20:56:09 -0000", 
     "record_date": "2013-10-14" 
    }, 
    { 
     "rating": 2, 
     "notes": null, 
     "last_updated": "Mon, 14 Oct 2013 20:56:09 -0000", 
     "record_date": "2013-09-14" 
    } 
] 

Unit Test:

rv = self.app.get('/rest/records/{0}/{1}/{2}'.format(email, password, sync_date)) 
resp = json.loads(rv.data)   
eq_(len(resp),2) 

Но поскольку его юникода с 200-иш символов, а не список с двумя объектами, тест блок выходит из строя.

Любая идея, что мне не хватает, пожалуйста?

print repr(resp) выводит это:

str: u'[{"rating": 1, "notes": null, "last_updated": "Mon, 14 Oct 2013 21:33:07 -0000", "record_date": "2013-10-14"}, {"rating": 2, "notes": null, "last_updated": "Mon, 14 Oct 2013 21:33:07 -0000", "record_date": "2013-09-14"}]' 

Надеется, что это помогает

+1

* Но поскольку его юникода с 200-иш символов, а не список с двумя объектами, тест блок не *. Можете ли вы показать нам, что такое 'print repr (resp)' is? Это звучит неправильно; ваш метод должен возвращать строку JSON, представляющую список. –

+0

Конечно, я просто добавил. Спасибо – Houman

+1

Это не то, что я просил вас предоставить, это ваш отказ в тестировании; что означает 'print repr (resp)' print? –

ответ

3

Колбы-успокоительным уже кодирующим ваши данным в формат JSON для вас. Вы вернули строку JSON, а Flask закодировали ее снова на JSON .

Вернуть список вместо:

return m_records 
+0

Тест проходит. Большое спасибо. :) – Houman