flask restful:如何将python函数作为参数触发GET请求?

时间:2020-04-22 13:02:40

标签: python flask flask-restplus

在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()'])

我试图将会话传递给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请求时,我认为出了点问题。如何在GET请求中传递自定义python函数或对象作为参数,以便在服务器端点上打印出某些内容?有什么主意吗?

我是flask-restplus的新手,所以也许我不应该将sess传递给如上所述的GET请求。我虚心请求可能的帮助。谢谢

1 个答案:

答案 0 :(得分: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!

如何在每个获取请求中调用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 -