发布
社区首页 >问答首页 >如何使用http.server执行服务器端python脚本?

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

Stack Overflow用户
提问于 2018-03-21 05:23:58
回答 2查看 12.6K关注 0票数 2

我有一个python脚本的集合,我希望能够与按钮按下,从网络浏览器执行。

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

另外,如果没有,有没有一种简单的方法(比如只有一两个文件)来实现这一点呢?我正在寻找python的等价物,但用于-s。

为了完整起见,下面是我的html

代码语言:javascript
代码运行次数:0
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-21 06:58:13

--cgi添加到命令行。

代码语言:javascript
代码运行次数:0
复制
python -m http.server --cgi 8000

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

代码语言:javascript
代码运行次数:0
复制
$ mkdir cgi-bin
$ cp hello.py cgi-bin/hello.py
$ chmod +x cgi-bin/hello.py

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

下面是正在运行的服务器:

代码语言:javascript
代码运行次数:0
复制
$ 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

票数 2
EN

Stack Overflow用户

发布于 2018-03-21 06:04:38

http.server只服务于静态文件,当你访问python文件时,它不做任何服务器端处理或执行任何代码。如果您想运行一些python代码,则必须编写一个应用程序来执行此操作。Flask是一个Python web框架,可能非常适合这项任务。

你的flask应用程序可能看起来像这样来执行脚本...

代码语言:javascript
代码运行次数:0
复制
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)

当然,我应该包括一个强制性的警告,“让the服务器执行这样的命令是不安全的”,等等。查看Flask quickstart了解更多详细信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49394355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档