如何使用http.server执行服务器端python脚本?

时间:2018-03-20 21:23:58

标签: python python-3.x

我有一组python脚本,我希望能够通过网页浏览器按下按钮执行。

目前,我运行python -m http.server 8000以在端口8000上启动服务器。它可以很好地提供html页面,但这就是它的全部功能。是否可以让它执行python脚本(通过ajax)并返回输出,而不是只返回.py文件的全文。

此外,如果没有,是否有一个简单的(如只有1或2个文件)方式使这项工作?我正在寻找相当于PHP -s,但是对于python。

为了完整性,这是我的HTML

<h1>Hello World</h1>

<button>
Click me!
</button>

<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.js">    </script>

<script>
  $('button').click(function(){
    $.get('/gui/run_bash.py');
  });
</script>

2 个答案:

答案 0 :(得分:1)

http.server仅提供静态文件,当您点击python文件时,它不会执行任何服务器端处理或执行任何代码。如果你想运行一些python代码,你必须编写一个应用程序来做到这一点。 Flask是一个Python Web框架,可能非常适合这项任务。

您的烧瓶应用程序可能看起来像执行脚本......

import subprocess
from flask import Flask
app = Flask(__name__)

SCRIPTS_ROOT = '/path/to/script_dir' 
@app.route('/run/<script_name>')
def run_script(script_name):
    fp = os.path.join(SCRIPTS_ROOT, script_name)
    try:
        output = subprocess.check_output(['python', fp])
    except subprocess.CalledProcessError as call:
        output = call.output # if exit code was non-zero
    return output.encode('utf-8') # or your system encoding

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8000)

当然,我应该包括强制性警告'让网络服务器执行这样的命令是不安全的'等等。查看Flask quickstart了解更多详情。

答案 1 :(得分:1)

--cgi添加到命令行。

python -m http.server --cgi 8000

然后将您的python脚本放在./cgi-bin中并将它们标记为可执行文件。

$ mkdir cgi-bin
$ cp hello.py cgi-bin/hello.py
$ chmod +x cgi-bin/hello.py

您可能需要稍微修改您的python脚本以支持CGI协议。

这是运行的服务器:

$ cat cgi-bin/hello.py 
#! /usr/bin/env python3

print("Content-Type: application/json")
print()

print('{"hello": "world"}')
radams@wombat:/tmp/z/h$ python -m http.server --cgi
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
127.0.0.1 - - [20/Mar/2018 18:04:16] "GET /cgi-bin/hello.py HTTP/1.1" 200 -

参考:https://docs.python.org/3/library/http.server.html#http.server.CGIHTTPRequestHandler