【问题标题】:Exposing Python Script as an API or Service将 Python 脚本公开为 API 或服务
【发布时间】:2018-01-09 07:16:41
【问题描述】:

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

现在棘手的部分来了。

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

下面给出我的初始基本代码 sn-p 供您参考:

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 框架的运气。但我不确定如何通过提供参数来使用烧瓶调用主函数。

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' 对象不可下标

Traceback(最近一次调用最后一次)文件 “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 响应 = self.handle_exception(e) 文件中 “C:\Users\user_name\Anaconda3\lib\site-packages\flask\app.py”,行 1540, 在 handle_exception reraise(exc_type, exc_value, tb) 文件中 "C:\Users\user_name\Anaconda3\lib\site-packages\flask_compat.py", 第 33 行,在 reraise raise value 文件中 “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 reraise(exc_type,exc_value,tb)文件 "C:\Users\user_name\Anaconda3\lib\site-packages\flask_compat.py", 第 33 行,在 reraise raise value 文件中 “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 行,在 main id1 = app.config.get['ID1'] TypeError: 'builtin_function_or_method' 对象 不可下标 调试器在您的 WSGI 中捕获了异常 应用。您现在可以查看导致错误的回溯。 要在交互式回溯和纯文本回溯之间切换,您 可以点击“Traceback”标题。从文本回溯中,您可以 也创建它的粘贴。对于代码执行,将鼠标悬停在您的框架上 想要调试,点击右侧的控制台图标。

您可以在堆栈帧中执行任意 Python 代码 有一些额外的帮助器可用于自省:

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

谁能告诉我如何解决这个问题,以及如何通过将其公开为 API 或服务从任何机器执行此脚本。

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 谢谢@UssiSonad。但是在创建http链接后,我无法从其他机器访问它。例如:假设在我的机器上我可以创建一个链接为“127.0.0.1:5000/myFirstArg/mySecondArg”。所以我相信如果我用我的系统 IP 地址替换 127.0.0.1 并尝试从其他机器连接它应该可以工作。但我收到“连接被拒绝”网络错误(tcp_error)。知道如何解决这个问题吗?
    • 这是因为 Flask 服务器只是开发服务器,而不是您公开的服务器。默认情况下无法远程访问它。您需要一种单独的方式来部署代码。看看这个flask.pocoo.org/docs/0.12/deploying。 Localtunnel 可能适合您的需要。
    • 我无法手动获取 Localtunnel 创建的链接。所以对我没有多大帮助。但我自己想通了。您需要在客户端机器中通过 app.run(host = '0.0.0.0') 启动应用程序。然后您可以使用客户端机器的 ip 地址而不是 127.0.0.1 从另一台机器访问该应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多