2015-10-05 3 views
1

У меня есть представление, которое возвращает данные JSON. Я хочу также получить эти данные из другого представления, поэтому я попытался вызывать представление JSON. Однако был возвращен Response, а не данные JSON. Как я могу вызвать один вид из другого представления и получить данные?Получить json с одного взгляда, вызвав его из другого представления

@app.route('/promoters/<int:id>', methods=['GET']) 
def get_promoter(id): 
    ... 

>>> get_promoter(3) 
<Response 440 bytes [200 OK]> 

ответ

2

декоратор из вида-функции может преобразовать возвращаемое значение в Response объекте в зависимости от его типа (более подробной информации об этих правилах проверки из here). Данные json хранятся в r.response, где r - это объект Response.

Лучшим решением является создание отдельной функции, которая возвращает данные json, которые могут быть вызваны из двух разных функций вида.

+1

«Возвращаемое значение функции просмотра всегда будет автоматически обернуто» неточно. 'route' просто записывает функцию и возвращает ее, она не добавляет никакой последующей обработки. Выполнение запроса возвращает ответ, а некоторые представления могут возвращать 'Response', а не строку, но просто украшение функции не возвращает ответ. – davidism

+0

Совершенно верно, я пропустил это. Я хотел сосредоточиться на «автоматически», а не на «всегда». Я отредактирую это в своем ответе. – HelloWorld

0

У вашего вида return jsonify(...) в конце его. jsonify возвращает Response с данными JSON, он не возвращает исходные данные напрямую. Вы можете повторно проанализировать данные JSON из объекта ответа, или вы можете отделить функцию, которая генерирует данные из представления, которое возвращает ответ.

from flask import json 
r = get_promoter(id) 
data = json.loads(r.data, encoding=r.charset)) 
# or separate the data from the view 
def get_promoter(id): 
    return json.dumps(...) 

@app.route(...) 
def promoter(id): 
    return jsonify(**get_promoter(id)) 

@app.route(...) 
def other_view(): 
    promoter = get_promoter(400617) 
    ... 

Другие виды могут возвращать другие типы данных. jsonify происходит с возвратом объекта Response, но другие допустимые возвращаемые значения являются строками (например, от render_template) и кортежей. Любой из них будет преобразован в Responses, когда Flask обрабатывает запрос, но когда только вызывается функция просмотра, они возвращают все, что они возвращают, что может оказаться a Response.

0

Вы можете написать декоратор для ваших просмотров справиться с этим:

from flask import jsonify 
from functools import wraps 

def jsonify_or_raw(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     raw = False 
     if "raw" in kwargs: 
      raw = kwargs["raw"] 
      del kwargs["raw"] 
     result = func(*args, **kwargs) 
     return jsonify(result) if not raw else result 
    return wrapper 

Вы бы использовать декоратор так:

@app.route('/promoters/<int:id>', methods=['GET']) 
@jsonify_or_raw 
def get_promoter(id): 
    return {"your data": "goes here"} 

декоратор будет обрабатывать оборачивать ваши данные в ответ через flask.jsonify - но вы также можете получить данные с другого вида, выполнив следующие действия:

@app.route('/some_page', methods=['GET']) 
def some_page(): 
    promoter = get_promoter(1, raw=True) 
    ... 
Смежные вопросы