在同一个 python 脚本中服务和请求

问题描述 投票:0回答:2

我试图简单地启动一个 HTTP 服务器,这样我就可以调用一个需要通过 HTTP 访问本地文件的子进程,但是使用以下代码运行服务器会阻止进一步的代码执行:

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()
    print('Hello, server!')  # Never executed

从同一个脚本启动服务器、发出请求然后关闭服务器的最简单方法是什么?

python http concurrency subprocess kill
2个回答
0
投票

看起来你正在使用文档中的代码,这很好! https://docs.python.org/3/library/http.server.html?highlight=simplehttprequesthandler#http.server.SimpleHTTPRequestHandler

{SimpleHTTPRequestHandler} 就是为了以这种方式工作。问题是

server_forever
永远不会回来。像这样的大多数进程都是为了从服务器关闭(通过 cronscript 或类似的或手动的)而不是外部请求。

您希望服务器处理多少个请求?您必须继承自 {SimpleHTTPRequestHandler} 并更改您不喜欢的行为,或者使用您想要的特定逻辑创建自己的处理程序。

我的意思的一个例子,用户来传输一个文件。那你的服务器应该关闭吗?如果他们想传输另一个文件怎么办?如果你没有那么多地使用它,你可以从一个保持它打开 5 分钟的脚本启动它,然后在没有活动传输或其他东西时终止进程。

如果你想要一些具有更复杂行为的东西,你将不得不编写一个更复杂的处理程序。

如果您可以添加更多信息,我会更新我的答案。


0
投票

您可以使用

threading
requests
来做到这一点。下面是一个 Python 脚本的小型工作示例,它启动一个 HTTP 服务器,然后在同一个程序中与它对话。它将使用对
test.txt
的请求显示
http://localhost:8000/test.txt
的内容。它等待一秒钟然后结束服务器。

import http.server
import socketserver
import threading
import requests

# create a test file
with open("test.txt", "w") as file:
    file.write("hello!")

PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler

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

server_thread = threading.Thread(target=run_server)
# set daemon to true so that the thread exits when the main program is done
server_thread.daemon = True
server_thread.start()

print('Hello, server!')

response = requests.get('http://localhost:8000/test.txt')

if response.status_code == 200:
    print("Content of 'test.txt':")
    print(response.text)
else:
    print(f"Error: {response.status_code}")

print('Goodbye, server!')

# Give the server a moment to finish processing any pending requests before the script exits
server_thread.join(timeout=1)

# Clean up test.txt
import os
os.remove("test.txt")
© www.soinside.com 2019 - 2024. All rights reserved.