The*_*Man 9 html python ajax jquery
我有Apache2安装和Python工作.
我虽然遇到了问题.我有两页.
一个是Python页面,另一个是带有JQuery的Html页面
有人可以告诉我如何让我的ajax帖子正常工作.
<html>
<head>
</head>
<body>
<script>
$(function()
{
alert('Im going to start processing');
$.ajax({
url: "saveList.py",
type: "post",
data: {'param':{"hello":"world"}},
dataType: "application/json",
success : function(response)
{
alert(response);
}
});
});
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
和Python代码
import sys
import json
def index(req):
result = {'success':'true','message':'The Command Completed Successfully'};
data = sys.stdin.read();
myjson = json.loads(data);
return str(myjson);
Run Code Online (Sandbox Code Playgroud)
Vis*_*ioN 11
好的,让我们转到您更新的问题.
首先,您应该以字符串表示形式传递Ajax数据属性.然后,由于您混合dataType和contentType属性,将dataType值更改为"json":
$.ajax({
url: "saveList.py",
type: "post",
data: JSON.stringify({'param':{"hello":"world"}}),
dataType: "json",
success: function(response) {
alert(response);
}
});
Run Code Online (Sandbox Code Playgroud)
最后,修改您的代码以使用JSON请求,如下所示:
#!/usr/bin/python
import sys, json
result = {'success':'true','message':'The Command Completed Successfully'};
myjson = json.load(sys.stdin)
# Do something with 'myjson' object
print 'Content-Type: application/json\n\n'
print json.dumps(result) # or "json.dump(result, sys.stdout)"
Run Code Online (Sandbox Code Playgroud)
因此,在successAjax请求的处理程序中,您将收到带有success和message属性的对象.
您应该像这样读取 json 数据:
#!/usr/bin/env python3
import os
import sys
import json
content_len = int(os.environ["CONTENT_LENGTH"])
req_body = sys.stdin.read(content_len)
my_dict = json.loads(req_body)
Run Code Online (Sandbox Code Playgroud)
使用以下代码,您可能会遇到问题:
myjson = json.load(sys.stdin)
Run Code Online (Sandbox Code Playgroud)
或者写得不那么简洁:
requ_body = sys.stdin.read()
my_dict = json.load(requ_body)
Run Code Online (Sandbox Code Playgroud)
当我的 cgi 脚本在服务器上时,这确实对我有用apache,但是您不能指望一般情况下可以正常工作——正如我在我的 cgi 脚本在另一台服务器上时发现的那样。根据 cgi 规范:
RFC 3875 CGI Version 1.1 October 2004
4.2. Request Message-Body
Request data is accessed by the script in a system-defined method;
unless defined otherwise, this will be by reading the 'standard
input' file descriptor or file handle.
Request-Data = [ request-body ] [ extension-data ]
request-body = <CONTENT_LENGTH>OCTET
extension-data = *OCTET
A request-body is supplied with the request if the CONTENT_LENGTH is
not NULL. The server MUST make at least that many bytes available
for the script to read. The server MAY signal an end-of-file
condition after CONTENT_LENGTH bytes have been read or it MAY supply
extension data. Therefore, the script MUST NOT attempt to read more
than CONTENT_LENGTH bytes, even if more data is available. However,
it is not obliged to read any of the data.
Run Code Online (Sandbox Code Playgroud)
关键线是:
脚本不得尝试读取超过 CONTENT_LENGTH 个字节,即使有更多数据可用。
显然,apache在将请求正文发送到 cgi 脚本后立即向 cgi 脚本发送一个 eof 信号,这会导致sys.stdin.read()返回。但是根据cgi规范,在请求正文之后不需要服务器发送eof信号,我发现我的cgi脚本挂了--sys.stdin.read()当我的脚本在另一台服务器上时,最终导致超时错误.
因此,为了在一般情况下读取 json 数据,您应该这样做:
content_len = int(os.environ["CONTENT_LENGTH"])
req_body = sys.stdin.read(content_len)
my_dict = json.loads(req_body)
Run Code Online (Sandbox Code Playgroud)
服务器为cgi脚本设置了一堆环境变量,其中包含头信息,其中一个是CONTENT_LENGTH。
这是我使用时失败的 curl 请求的样子myjson = json.load(sys.stdin):
-v verbose output
-H specify one header
--data implicitly specifies a POST request
Note that curl automatically calculates a Content-Length header
for you.
Run Code Online (Sandbox Code Playgroud)
~$ curl -v \
> -H 'Content-Type: application/json' \
> --data '{"a": 1, "b": 2}' \
> http://localhost:65451/cgi-bin/1.py
* Trying ::1...
* TCP_NODELAY set
* Connection failed
* connect to ::1 port 65451 failed: Connection refused
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 65451 (#0)
> POST /cgi-bin/1.py HTTP/1.1
> Host: localhost:65451
> User-Agent: curl/7.58.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 16
>
* upload completely sent off: 16 out of 16 bytes
=== hung here for about 5 seconds ====
< HTTP/1.1 504 Gateway Time-out
< Date: Thu, 08 Mar 2018 17:53:30 GMT
< Content-Type: text/html
< Server: inets/6.4.5
* no chunk, no close, no size. Assume close to signal end
<
* Closing connection 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27288 次 |
| 最近记录: |