【问题标题】:flask restful: how do I pass python function as a parameter to trigger GET request?flask restful:如何将 python 函数作为参数传递来触发 GET 请求?
【发布时间】:2020-04-22 22:02:28
【问题描述】:

在 flask-restplus 中,我想将系统调用对象:subprocess.call() 传递给 GET 请求以在服务器端点上打印 R 会话信息。为此,我想我需要将系统调用对象添加到解析器,我希望 api 端点打印出 R 会话信息。但是,当我点击代码时,我没有在服务器端点上看到任何打印的会话信息。我怎样才能正确地将system.call() 传递给GET 请求以便在端点上打印一些东西?有什么想法吗?

我的尝试

这是可以在 python IDE 控制台上打印出 R 会话的系统调用。

sess = subprocess.call(['C:/Program Files/R/R-3.6.3/bin/Rscript','--vanilla','-e','sessionInfo()'])

我尝试将 sess 传递给 GET 请求

from flask import Flask, jsonify
from flask_restplus import Api, Resource, fields, reqparse, inputs
import subprocess

app = Flask(__name__)
api = Api(app)
ns = api.namespace('sess')

sess = subprocess.call(['C:/Program Files/R/R-3.6.3/bin/Rscript','--vanilla','-e','sessionInfo()'])

@ns.route('/')
class AResource(Resource):
    def get(self):
        parser = reqparse.RequestParse()
        parser.add_argument(sess, type= str, required=True)
        #return parser.parse_args()
        try:
            args = parser.parse_args()
            return jsonify(args)
        except:
            return None, 400

if __name__ == '__main__':
    app.run(debug=True)

当我运行代码时,我在服务器端点上看不到任何打印的会话信息。当我将 sess 对象传递给 GET 请求时,我认为有问题。如何将自定义 python 函数或对象作为参数传递给 GET 请求,以便在服务器端点上打印出一些东西?有什么想法吗?

我是 flask-restplus 的新手,所以也许我不应该像上面那样将 sess 传递给 GET 请求。我谦卑地请求可能的帮助。谢谢

【问题讨论】:

  • 请注意,您在线调用 sess 一次,就是在您启动烧瓶应用程序的时候。您想为收到的每个请求调用 subprocess.call 吗?
  • @Bernardostearnsreisen 是的,我想为您收到的每个请求调用 subprocess.call。我该如何做对?有什么想法吗?
  • 我回答了我认为是问题所在
  • @Bernardostearnsreisen 我尝试了完全相同的代码,但我在响应正文中得到了这个:{ "message": "Internal Server Error" }。这很奇怪
  • 你能用你更新的代码编辑你的帖子吗? message": "Internal Server Error" 表示您在烧瓶应用程序上遇到了 pythor 错误

标签: python flask flask-restplus


【解决方案1】:

为了清楚起见,没有烧瓶,您至少应该得到输出。

例如运行一个虚拟脚本:

from flask import Flask
from flask_restplus import Api
import subprocess

app = Flask(__name__)
api = Api(app)

sess = subprocess.call(["echo","I am getting this output!"])

会输出

I am getting this output!

如何在每个 get 请求中调用 subprocess.call

  1. 只需将 subprocess.call 移至 get 请求即可。
  2. 注意不要在“/”上创建 API 端点,因为 flask_restplus 默认使用它作为 api 参考页面,这样会引起混淆。所以一定要使用像'/hello'这样的端点

示例代码

from flask import Flask
from flask_restplus import Resource, Api
from flask_restplus import Api
import subprocess
import os

app = Flask(__name__)
api = Api(app)

@api.route('/hello')
class HelloWorld(Resource):
    def get(self):
        subprocess.call(["echo","I am getting this output!"])
        subprocess.call(['Rscript','--vanilla','-e','sessionInfo()'])
        return {'hello123': 'world'}

if __name__ == '__main__':
    app.run(debug=True)

当我在终端上运行应用程序并在浏览器上请求 http://localhost:5000/hello 时,我会在终端上看到此输出

I am getting this output!
R version 3.6.3 (2020-02-29)
Platform: x86_64-apple-darwin18.7.0 (64-bit)
Running under: macOS Mojave 10.14.5

Matrix products: default
BLAS/LAPACK: /usr/local/Cellar/openblas/0.3.9/lib/libopenblasp-r0.3.9.dylib

locale:
[1] en_IE.UTF-8/en_IE.UTF-8/en_IE.UTF-8/C/en_IE.UTF-8/en_IE.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

loaded via a namespace (and not attached):
[1] compiler_3.6.3
127.0.0.1 - - [22/Apr/2020 15:01:16] "GET /hello HTTP/1.1" 200 -

【讨论】:

  • 你能确定你的输出正确吗?为什么我在响应正文中有内​​部服务器错误?
  • 这完全确定,你可以简单地复制粘贴并运行这段代码
  • 我假设你没有安装 R,如果没有,你介意尝试一下,你能在服务器端点上获取 R 会话信息吗?奇怪的是,我使用了与您完全相同的代码并运行,但没有收到您的输出消息,我在响应正文中得到了internal server error
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多