社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

服务器端使用python的post请求句柄[duplicate]

Soumyajit Seal • 5 年前 • 220 次点击  

我已经安装了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>

以及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);
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47611
 
220 次点击  
文章 [ 2 ]  |  最新文章 5 年前
7stud
Reply   •   1 楼
7stud    7 年前

您应该像这样读取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)

使用以下代码,可能会遇到问题:

 myjson = json.load(sys.stdin)

或者写得不那么简洁:

requ_body = sys.stdin.read()
my_dict = json.load(requ_body)

那个 当我的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.

关键是:

脚本不能试图读取更多 比内容长度字节长,即使有更多数据可用。

显然地, 阿帕奇 在向cgi脚本发送请求正文后立即向cgi脚本发送eof信号,这会导致 sys.stdin.read() 回来。但是根据cgi规范,服务器不需要在请求主体之后发送eof信号,我发现我的cgi脚本挂起了 系统stdin.read() --当我的脚本在另一台服务器上时,最终导致超时错误。

因此,为了在一般情况下读入json数据,您应该执行以下操作:

content_len = int(os.environ["CONTENT_LENGTH"])

req_body = sys.stdin.read(content_len)
my_dict = json.loads(req_body)

服务器为cgi脚本设置一组环境变量,这些变量包含头信息,其中之一是内容长度。

下面是当我使用 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.

~$ 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
VisioN
Reply   •   2 楼
VisioN    13 年前

好的,让我们转到你的最新问题。

首先,应该以字符串表示形式传递ajax数据属性。那么,既然你混合了 dataType contentType 属性,更改 数据库类型 价值 "json" 以下内容:

$.ajax({
    url: "saveList.py",
    type: "post",
    data: JSON.stringify({'param':{"hello":"world"}}),
    dataType: "json",
    success: function(response) {
        alert(response);
    }
});

最后,修改代码以处理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)"

因此,在 success 接收对象的ajax请求的处理程序 成功 message 性能