Python Server接收GET请求触发脚本失败,报501错误求助
问题分析与解决
让我们一步步拆解你遇到的问题:
核心问题1:服务器未完成HTTP响应流程
你重写了do_GET方法,但没有按照HTTP协议要求发送响应内容。BaseHTTPRequestHandler默认会在未正确处理请求时返回501错误——服务器认为你的GET请求处理逻辑不完整,这就是你看到Unsupported method ('GET')的原因。
核心问题2:脚本路径的转义错误
你写的execfile("root\externalFunc.py")里,Windows下的反斜杠\是转义字符,\e会被解析成特殊字符,导致实际路径和你预期的不符,execfile根本找不到你的脚本文件。
额外小问题:客户端代码缺少必要导入
你的客户端代码里没有导入httplib模块,运行时会直接抛出NameError,这是客户端的低级疏漏。
修正后的服务器代码
#!/usr/bin/env python from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import os class KodeFunHTTPRequestHandler(BaseHTTPRequestHandler): def do_GET(self): # 修复路径:用双反斜杠转义,或者直接用正斜杠 try: # 执行外部脚本 execfile("root\\externalFunc.py") # 也可以写成 "root/externalFunc.py" # 发送成功响应,告诉客户端请求已处理 self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() # 可选:给客户端返回执行成功的提示 self.wfile.write("Script executed successfully!") except Exception as e: # 发送错误响应,同时在服务器控制台打印错误便于调试 self.send_response(500) self.send_header('Content-type', 'text/html') self.end_headers() error_msg = f"Error executing script: {str(e)}" self.wfile.write(error_msg) print(error_msg) def run(): print('http server is starting...') server_address = ('127.0.0.1', 80) httpd = HTTPServer(server_address, KodeFunHTTPRequestHandler) print('http server is running...') httpd.serve_forever() if __name__ == '__main__': run()
修正后的客户端代码
import sys import httplib # 补上缺失的导入 http_server = '127.0.0.1' conn = httplib.HTTPConnection(http_server) conn.request('GET', '/','') # 补充请求路径,空字符串可能导致识别异常 rsp = conn.getresponse() print(rsp.status, rsp.reason) data_received = rsp.read() print(data_received) conn.close()
额外提示
- 如果
externalFunc.py和服务器脚本不在同一目录,建议使用绝对路径调用,彻底避免路径问题。 - 如果你用的是Python 3,
BaseHTTPServer已被移到http.server模块,且execfile被移除,需要用exec(open("root/externalFunc.py").read())替代。 - 直接执行外部脚本存在安全风险,生产环境中建议添加请求验证逻辑,避免任意请求触发脚本执行。
内容的提问来源于stack exchange,提问作者thib
相关产品推荐
相关产品推荐

