使用Ajax从JavaScript调用Python脚本遇404 Not Found错误求助
解决Ajax调用Python脚本时的404错误问题
Hey there, let's break down what's happening here and fix it:
问题根源
你现在应该是用的静态文件服务器(比如VS Code的Live Server、Python自带的http.server默认模式这类)来托管你的文件。这类服务器的作用只是把文件原封不动地返回给浏览器——所以当你直接访问http://127.0.0.1:8887/text.py时,它只会把Python代码当作文本显示,根本不会执行脚本。
而当你用Ajax发POST请求时,静态服务器要么因为不支持POST请求静态文件返回404,要么就算返回内容,也是脚本源码,不是你想要的执行结果。
解决方案:让服务器能执行Python脚本
你不需要用Flask(虽然它很方便),用Python自带的工具就能搞定,下面给你两个简单的方案:
方案1:用支持CGI的静态服务器
CGI是一种让服务器执行脚本的旧标准,Python自带支持:
- 第一步:给你的
text.py开头加上shebang(Windows可以跳过,Linux/macOS需要):#!/usr/bin/env python3 - 第二步:如果是Linux/macOS,给脚本加执行权限:
chmod +x text.py - 第三步:把
text.py放到一个名为cgi-bin的文件夹里(这是CGI服务器默认的脚本目录) - 第四步:启动支持CGI的服务器:
python -m http.server --cgi 8887 - 第五步:修改你的Ajax请求URL为
http://127.0.0.1:8887/cgi-bin/text.py,这样服务器就会执行脚本并返回结果了。
方案2:用WSGI写极简后端
如果觉得CGI麻烦,用Python自带的wsgiref写一个超简单的后端:
- 创建一个
server.py文件,内容如下:
from wsgiref.simple_server import make_server import cgi def application(environ, start_response): # 只处理POST请求 if environ['REQUEST_METHOD'] == 'POST': # 解析POST过来的数据 form_data = cgi.FieldStorage( fp=environ['wsgi.input'], environ=environ, keep_blank_values=True ) # 这里把你原来text.py里的逻辑放进来 # 比如假设你要处理表单里的content参数: user_input = form_data.getvalue('content', '') result = f"你输入的内容是:{user_input}" # 返回响应 status = '200 OK' headers = [('Content-type', 'text/plain; charset=utf-8')] start_response(status, headers) return [result.encode('utf-8')] else: # 处理非POST请求 status = '405 Method Not Allowed' headers = [('Content-type', 'text/plain; charset=utf-8')] start_response(status, headers) return [b"只接受POST请求哦"] if __name__ == '__main__': # 启动服务器 httpd = make_server('127.0.0.1', 8887, application) print("服务器运行在 http://127.0.0.1:8887") httpd.serve_forever()
- 运行
python server.py启动服务器 - 修改你的Ajax请求URL为
http://127.0.0.1:8887,这样就能触发Python脚本的逻辑并拿到返回结果了。
最后再强调一下
静态服务器只能返回文件内容,不能执行代码——这就是为什么你直接访问能看到Python源码,但Ajax请求得不到正确响应的原因。上面的两个方案都能让服务器执行你的Python脚本,选哪个全看你觉得哪个更顺手~
内容的提问来源于stack exchange,提问作者Ore Arowobusoye
相关产品推荐
相关产品推荐

