是否有办法将本地flask http请求转换为函数调用?



目前,在我们的系统中,即使在同一个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调用。

最新更新