【问题标题】:Start a python script on server from webpage从网页在服务器上启动 python 脚本
【发布时间】:2019-08-02 18:10:21
【问题描述】:

有没有办法从网页在服务器上启动 python 脚本?

在工作中,我使用 selenium 编写了一个简单的 python 脚本来执行日常工作(打开网页并单击几个按钮)。

我希望能够远程启动它(仍然在公司网络上),但由于工作中的安全/权限,我不能使用 telnet/shh/etc 或安装 PHP(我读过这是一种方法去做)。

我之前制作了简单的 python 服务器,它可以发送/接收 REST 请求,但我找不到使用 javascript(我有点习惯)从网页发送的方法。 我发现了一些人们建议使用 AJAX 的搜索结果,但我无法让它工作

它只不过是一个带有一个按钮的空白页面,它向我的服务器发送请求,然后启动脚本。

感谢您的帮助。

【问题讨论】:

  • 使用类似Flask / Django / Pyramid 设置@route 调用你的函数:)
  • 你之前的“简单的python服务器,可以发送/接收REST请求”用了什么?利用先前的经验,您可能更容易掌握答案。
  • 我们在大学创建了一些 SimpleHTTPServers 和套接字服务器。它们的构建可能并不那么简单,但它们的功能却很简单。

标签: python html rest server


【解决方案1】:

一般来说,您会想要编写一个简单的服务器,它在 GET 请求中返回 HTML 表单,并在 POST 请求中处理该表单。

例如,使用Bottle 的一个非常简单但完全有效的示例:

from bottle import get, post, run

from subprocess import check_output

@get('/')
def home():
    return '<form method="post"><input type="submit" value="Click me!"></form>'

@post('/')
def on_submit():
    return "Today's date is " + check_output(['date']).decode()

run(host='localhost', port=8080)

或者只使用带有 http.server 的标准库的东西,这是相同的概念,尽管有更多的样板:

import http.server
import socketserver

from subprocess import check_output

class Handler(http.server.BaseHTTPRequestHandler):
    def html_preamble(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()

    def do_GET(self):
        self.html_preamble()
        response = '<form method="post"><input type="submit" value="Click me!"></form>'
        self.wfile.write(response.encode('utf-8'))

    def do_POST(self):
        self.html_preamble()
        response = "Today's date is " + check_output(['date']).decode()
        self.wfile.write(response.encode('utf-8'))

PORT = 8081
with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

无论如何,由于您使用 Python 编写了 Selenium 脚本,您可能只想导入相关函数并直接调用它们,而不是通过子进程,只需注意资源泄漏并确保您的函数清理任何不需要在请求之间保留的资源。

【讨论】:

    【解决方案2】:

    您可以通过多种方式开始。 您可以尝试通过CGI 提供您的 Python 脚本。

    或者,您可以将脚本封装到 Web 框架中,例如 FlaskDjango。 考虑到您的代码相对较小并且不需要在 SQL 中存储数据也不需要与用户交互,您应该使用 Flask,因为它非常轻量级并且在 Web 上有很好的文档记录。

    【讨论】:

    • 我想我会尝试使用 Flask,这似乎是大多数人的首选。
    【解决方案3】:

    我的例子是使用Flask:

    由于您不需要一个空格,因此打开 URL,您的 selenium 将运行。

    from flask import Flask
    app = Flask(__name__)
    
    @app.route("/start")
    def yourfunction():
        #start whatever you like here
        return #whatever you like to display eg. status / result 
    

    参考:Flask

    【讨论】:

    • 好的,这看起来可行。 (尽管感觉就像我花了很长时间才让那一点在 Windows 上工作)。
    猜你喜欢
    • 2011-12-02
    • 2020-08-15
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2016-02-06
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多