目前,在我们的系统中,即使在同一个flask应用程序中,我们也通过HTTP请求调用端点。所有请求都通过make_request包装器方法调用,如下所示:
def make_request(url, body, http_type="get"):
http_fn = getattr(requests, http_type)
response = http_fn(url, headers=headers, json=body)
return response.status_code, response
因此,我试图将同一flask应用程序中的所有本地请求转换为直接方法调用,以便同一flask应用程序中的任何端点都以这种方式调用:
def make_request(url, body, http_type="get"):
# Figure out If its local request call the function of the endpoint and construct the response
# If not make an http request
return response.status_code, response
编辑:尝试在url_map中搜索与端点相关的方法,但返回的函数不处于可调用状态。关于如何从这里调用这个方法有什么要点吗?for rule in current_app.url_map.iter_rules():
if my_url in rule.rule:
endpoint = rule.endpoint
for key, view in current_app.view_functions.items():
if key == endpoint:
# Found the view function, need to know how to call
# the right method( GET, POST etc)
视图包含以下内容:
{
'view_class': <class 'endpoints.attribute_endpoints.AttributeEndpoint'>,
'methods': {'GET', 'PUT', 'POST'}, 'provide_automatic_options': None, '__wrapped__': <function View.as_view.<locals>.view at 0x10c9190d0>}
如果我理解正确,您要实现的是在内部调用烧瓶端点而不经过http
。看看下面的解决方案,告诉我它是否符合你的要求。
旧代码:
@app.route('/someRoute', methods=['GET'])
def some_route_function():
json_object = request.get_json()
my_number = json_object['myNumber']
my_number = my_number**2
return jsonify(my_number=my_number)
新代码:
def square_number_func(number):
return number**2
@app.route('/someRoute', methods=['GET'])
def some_route_function():
json_object = request.get_json()
my_number = json_object['myNumber']
my_number = square_number_func(my_number)
return jsonify(my_number=my_number)
def my_non_flask_function():
my_number = 17
my_number = square_number_func(my_number)
这样你就可以得到你需要的功能,而不必依赖Flask的request
对象,也不必通过http
调用Flask。
编辑:如果你需要弄清楚它是否是一个内部烧瓶函数,那么你将它与本地global
范围或烧瓶app
中的函数列表进行比较,因为它确实存储了你的routes
。您甚至可以存储函数参数,以便知道调用什么。最后,如果需要将每个端点映射到字典或其他东西(如{some_route_function: square_number_func}
)中的另一个函数,那么可以告诉用哪个函数代替http
调用。