将Python脚本公开为API或服务

时间:2018-01-09 07:16:42

标签: python-3.x api web-services flask flask-restful

我使用Python已有一段时间了。我已经将我的python代码与java UI集成,并且工作正常。

现在有了棘手的部分。

我需要将我的python脚本公开为API,以便可以从任何地方执行它(也欢迎任何其他建议),而不依赖于存在python脚本的特定机器。

我的初始基本代码段如下所示:

import .....

def main(id1, id2):
    do something ........
    call sub-function(id1, id2)
    do something ........

if __name__ == '__main__':

    id1 = sys.argv[1] #Getting first argument from Java UI.
    id1 = sys.argv[1] #Getting first argument from Java UI.
    main(id1, id2)    #Calling Main function using two IDs as arguments.

只要我从java指向系统中的脚本路径,此代码就可以正常工作。但我需要更改此代码结构以将其公开为API或服务。我对如何实现这一目标一无所知。在几篇文章的帮助下,我尝试了Flask框架。但我不知道如何通过提供参数来调用使用flask的main函数。

import .....
from flask import Flask

app = Flask(__name__)

@app.route("/")
def main():
    do something ........
    id1 = app.config.get['ID1']
    id2 = app.config.get['ID2']
    call sub-function(id1, id2)
    do something ........

if __name__ == '__main__':

    #For simplicity I supplied the arguments' values manually instead of getting it from java.
    app.config['ID1'] = 101
    app.config['ID2'] = 2

    app.run(debug=True)

    #Commented out calling main function since app.run() will take care
    #main(id1, id2)    #Calling Main function using two IDs as arguments.

当我执行此操作并转到默认网址(http://127.0.0.1:5000)时,我收到以下错误

  

TypeError:'builtin_function_or_method'对象不可订阅

     

回溯(最近一次调用最后一次)文件   “C:\ Users \ user_name \ Anaconda3 \ lib \ site-packages \ flask \ app.py”,行   1997年,在调用返回self.wsgi_app(environ,start_response)文件   “C:\ Users \ user_name \ Anaconda3 \ lib \ site-packages \ flask \ app.py”,行   1985年,在wsgi_app response = self.handle_exception(e)文件中   “C:\ Users \ user_name \ Anaconda3 \ lib \ site-packages \ flask \ app.py”,行   1540,在handle_exception中重新加载(exc_type,exc_value,tb)文件   “C:\ Users \用户名\ Anaconda3 \ LIB \站点包\ flask_compat.py”   第33行,重新加注值文件   “C:\ Users \ user_name \ Anaconda3 \ lib \ site-packages \ flask \ app.py”,行   1982年,在wsgi_app response = self.full_dispatch_request()文件中   “C:\ Users \ user_name \ Anaconda3 \ lib \ site-packages \ flask \ app.py”,行   1614,在full_dispatch_request中rv = self.handle_user_exception(e)文件   “C:\ Users \ user_name \ Anaconda3 \ lib \ site-packages \ flask \ app.py”,行   1517,在handle_user_exception中重新加载(exc_type,exc_value,tb)文件   “C:\ Users \用户名\ Anaconda3 \ LIB \站点包\ flask_compat.py”   第33行,重新加注值文件   “C:\ Users \ user_name \ Anaconda3 \ lib \ site-packages \ flask \ app.py”,行   1612,在full_dispatch_request中rv = self.dispatch_request()文件   “C:\ Users \ user_name \ Anaconda3 \ lib \ site-packages \ flask \ app.py”,行   1598,在dispatch_request中返回   self.view_functionsrule.endpoint文件   “C:\ Users \ user_name \ Main_Script.py”,第29行,主要为id1 =   app.config.get ['ID1'] TypeError:'builtin_function_or_method'对象   不可订阅调试器在您的WSGI中捕获了异常   应用。您现在可以查看导致错误的回溯。   要在交互式回溯和纯文本之间切换,您   可以点击“Traceback”标题。从文本追溯中你可以   还会创建它的粘贴。对于代码执行鼠标悬停在框架上   想调试并点击右侧的控制台图标。

     

您可以在堆栈框架中执行任意Python代码   是一些额外的帮助可用于内省:

     

dump()显示帧转储(obj)中的所有变量转储所有这些   了解对象

任何人都可以通过将其作为API或服务公开,让我知道如何解决此问题以及如何从任何计算机执行此脚本。

1 个答案:

答案 0 :(得分:1)

据我所知,您正在寻找远程调用Python函数并将参数传递给它并获取结果。

例如:

@app.route('/<string:idOne>/<string:idTwo>')
def main(idOne,idTwo):
    do something
    return something

现在您可以发出HTTP GET请求。 例如:

http://127.0.0.1:5000/myFirstArg/mySecondArg