методы (http-глаголы) всех конечных точек в текущем проекте фляги

Я пытаюсь создать связанные ссылки для каждой конечной точки RESTful API, а не только для текущего запроса. Другой способ, который также был бы приемлемым, заключается в том, что я хочу сгенерировать все конечные точки текущего плана (в данном случае называемого «blueprint_name»). Вот резюме моей текущей настройки:

def function_that_generates_links():
   #what should I put here?

blueprint_name = Blueprint('blueprint_name', __name__, url_prefix='/blueprint_name')

@blueprint_name.route('/', methods=['GET'])
def endpoint_name():
   #regular_data_being_sent_out is defined somewhere here
   return jsonify(data=regular_data_being_sent_out,
                  links=function_that_generates_links())

@blueprint_name.route('/other_place', methods=['POST'])
def endpoint_name_other():
   #regular_data_being_sent_out is defined somewhere here
   return jsonify(data=regular_data_being_sent_out,
                  links=function_that_generates_links())
@blueprint_name.route('/another_place', methods=['DELETE'])
def endpoint_name_another_place():
   #regular_data_being_sent_out is defined somewhere here
   return jsonify(data=regular_data_being_sent_out,
                  links=function_that_generates_links())

@blueprint_name.route('/yet_another_place', methods=['PUT'])
def endpoint_name_yet_another_place():
   #regular_data_being_sent_out is defined somewhere here
   return jsonify(data=regular_data_being_sent_out,
                  links=function_that_generates_links())

Я хочу добавить к каждому ответу, отправляемому каждой конечной точкой, соответствующие http-подписи всех остальных конечных точек. В приведенном выше примере кода 'function_that_generates_links()' будет функцией для этого. Я уже обнаружил, что url_encode() предоставляет необходимую ссылку, которую я мог бы использовать, но мне также нужен соответствующий HTTP-глагол (GET, POST, DELETE... и т. д.). Он находит соответствующий http-глагол/метод, на котором я застрял. Глагол важен, потому что без него ссылки будут неполными/бесполезными.


person Marc    schedule 03.06.2014    source источник
comment
Что не так с использованием request.url и request.method?   -  person Pedro Werneck    schedule 04.06.2014
comment
Я исправлю свой ответ, но чтобы быть более конкретным. Я хочу, чтобы каждая конечная точка возвращала другие конечные точки. Использование «запроса» дает только текущий запрос, а не все возможные запросы текущего плана.   -  person Marc    schedule 04.06.2014


Ответы (3)


Вы можете перечислить все текущие правила с помощью app.url_map.iter_rules(). Затем rule.rule должен дать вам выражение URI, а rule.methods — набор доступных методов.

Однако, насколько я знаю, вы не можете сделать это для чертежа или отфильтровать по ним. Схема хранит маршруты, завернутые в лямбда-функции, которые будут вызываться при регистрации, и нет простого способа развернуть это. Если вам нужно пойти по этому пути, лучше создать подкласс Blueprint, переопределить метод маршрута и сохранить нужные параметры в самом экземпляре Blueprint.

person Pedro Werneck    schedule 04.06.2014
comment
это работает отлично, и после прочтения чертежей это, вероятно, единственный способ - person Marc; 05.06.2014

Марк,

request.method вернет метод, который использовался для вызова маршрута, на котором вы находитесь. Например, если бы у меня было:

@bluprint_name.route('/someresource', methods=["GET", "POST", "DELETE"]):
def return_a_resource():
    return request.method

Это напечатает метод, который использовался клиентом.

Чтобы было ясно, вы не можете кодировать метод в самом URL-адресе. Клиент должен будет прочитать метод из другого поля и соответствующим образом вызвать URL-адрес. URL - это просто местоположение и транспорт.

person TheHandofTheKing    schedule 04.06.2014
comment
Большое спасибо, я постараюсь быть более точным в своем вопросе. Хотя запрос дает текущую глагол запроса и URL-адрес, он не дает другие возможные URL-адреса/глаголы запроса. - person Marc; 04.06.2014

Я также хотел найти конечные точки для чертежа. Я придумал этот фрагмент:

def rules_for_blueprint(bp):
if bp._got_registered_once:
    return [rule for rule in app.url_map.iter_rules() if rule.endpoint.split('.')[0]==bp.name]
else:
    raise Exception("Blueprint routes only exist after blueprint is registered")

Он работает только после регистрации схемы, но для моего случая этого достаточно, и я уверен, что он пригодится и другим.

person greenglass    schedule 02.08.2015