2013-09-18 2 views
2

Я не занимаюсь много веб-разработкой, поэтому мои знания в этой области довольно простые. Однако мне нужно написать простое веб-приложение, используя python a колба.render_template не может jsonify объект

В этом приложении у меня есть простой класс, который выглядит следующим образом:

class Task(object):  
    def __init__(self, id, title): 
     super(Task, self).__init__() 
     self.id = id 
     self.title = title 

можно предположить, что id является integer и title является (unicode) string.

В функции зрения я хочу, чтобы сделать шаблон пропускания list из Task objects, как это:

@app.route('/tasklist') 
@login_required 
def tasklist(): 
    tasklist = [ 
     Task(1, u"Task 1"), 
     Task(2, u"Task 2"), 
     Task(3, u"Task 3"), 
     Task(4, u"Task 4") 
    ] 
    return render_template("tasklist.html", tasklist=tasklist) 

Когда функция просмотра называется, я получаю следующее об ошибке сообщения:

TypeError: <models.Task object at 0x103861210> is not JSON serializable 

Когда я оглядываюсь на interwebs, я вижу много примеров, где они передают списки объектов в представления, используя render_template. Поэтому мне интересно, чего мне не хватает? В моем объекте используются только базовые типы данных. Должен ли я перегружать определенную функцию?

Вызов render_template со списком простых строк (вместо экземпляров класса) отлично работает.

Я знаю, это очень простой вопрос, но на данный момент я не нашел удовлетворительного ответа.

ответ

2

Я не знаю много о колбе, но, похоже, для этого нужны сериализуемые объекты JSON, поэтому я думаю.

Обычно объекты не являются сериализуемыми JSON. Вы должны преобразовать его в JSON сериализуемого объект как, например, в словаре:

class Task(object):  
    def __init__(self, id, title): 
     self.id = id 
     self.title = title 

    def as_dict(self): 
     return { 
      "id": self.id, 
      "title": self.title 
     } 

, а затем

tasklist = [ 
    Task(1, u"Task 1"), 
    Task(2, u"Task 2"), 
    Task(3, u"Task 3"), 
    Task(4, u"Task 4") 
] 
tasklist = [task.as_dict() for task in tasklist] 
return render_template("tasklist.html", tasklist=tasklist) 
+0

Слишком легко! Большое спасибо. Я думал, что преобразование выполняется неявно, потому что я видел его во многих примерах (но, возможно, это было сделано другим модулем). Однако это решение работает отлично для меня! – cyphorious

Смежные вопросы