AngularJS调用Python脚本返回源码而非执行结果问题求助
解决Ajax调用Python脚本返回源码而非执行结果的问题
嘿,这个问题我之前刚帮朋友排查过!核心原因很简单:你用的Python 2.7基础HTTP服务器(SimpleHTTPServer)只是个静态文件托管工具,它会把所有文件原封不动地返回给客户端,根本不会去解析执行你的Python脚本——这就是为啥你拿到的是login.py的完整代码,而不是脚本运行后的结果。
下面给你两种解决方案,按需选择:
方案1:用CGIHTTPServer执行CGI脚本(适合快速测试)
如果你想继续用CGI模式,得换用Python自带的CGIHTTPServer,它支持执行CGI脚本。步骤如下:
第一步:修正你的Python脚本
CGI脚本必须满足两个要求:要有shebang头,还要输出合法的HTTP响应头。修改后的login.py应该是这样:
#!/usr/bin/env python import cgi import json # 获取GET请求参数(如果是POST的话逻辑类似) form = cgi.FieldStorage() userName = form.getvalue('userName', '') password = form.getvalue('password', '') # 这里写你的登录验证逻辑,示例仅做演示 if userName == 'admin' and password == 'test123': result = {"success": True, "msg": "登录成功"} else: result = {"success": False, "msg": "账号或密码错误"} # 必须先输出HTTP Content-Type头,再输出空行分隔头和内容 print "Content-Type: application/json" print print json.dumps(result)
第二步:调整文件结构并启动CGI服务器
- 把login.py移到项目根目录下新建的
cgi-bin文件夹里(CGIHTTPServer默认只会执行这个目录下的脚本) - 命令行启动服务器:
python -m CGIHTTPServer 8000
第三步:修改AngularJS的Ajax调用
要把URL改成/cgi-bin/login.py,并且把参数拼到URL里(因为是GET请求):
$scope.login = function(userName,password){ $http({ method : "GET", url : "/cgi-bin/login.py", params: { userName: userName, password: password } }).then(function (response) { console.log(response.data); }); };
方案2:用WSGI框架(推荐,适合实际开发)
CGI模式太老旧了,现在Python Web开发基本都用WSGI框架,比如Flask,比CGI优雅得多,还能轻松处理路由、请求、响应这些复杂逻辑。
第一步:安装Flask
pip install flask
第二步:写Flask应用(比如app.py)
from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/login', methods=['POST']) # 实际项目用POST更安全 def login(): # 获取请求参数(POST的话用request.form,JSON格式用request.get_json()) data = request.get_json() or request.form userName = data.get('userName', '') password = data.get('password', '') # 登录验证逻辑 if userName == 'admin' and password == 'test123': return jsonify({"success": True, "msg": "登录成功"}) else: return jsonify({"success": False, "msg": "账号或密码错误"}) if __name__ == '__main__': app.run(debug=True, port=8000)
第三步:修改AngularJS的Ajax调用
改成POST请求(更安全),URL直接用/login:
$scope.login = function(userName,password){ $http({ method : "POST", url : "/login", data: { userName: userName, password: password }, headers: {'Content-Type': 'application/json'} }).then(function (response) { console.log(response.data); }); };
第四步:启动Flask服务器
python app.py
几个重要提醒
- 用GET传密码非常不安全,实际项目一定要用POST+HTTPS
- Python 2.7已经停止维护好几年了,建议尽快升级到Python 3.x,Flask完全支持3.x版本
- 如果用CGI方案,Linux/macOS下要给脚本加执行权限:
chmod +x cgi-bin/login.py
内容的提问来源于stack exchange,提问作者Harsha Jasti
相关产品推荐
相关产品推荐

