使用AJAX在本地将数据从JavaScript发送到Python函数

使用AJAX在本地将数据从JavaScript发送到Python函数,javascript,jquery,python,ajax,Javascript,Jquery,Python,Ajax,我正在尝试建立一个网站,用户可以在其中输入文本,这些文本将通过javascript获取,并发送到python函数,然后发布到twitter上。目前,python函数与站点的其余部分一起存储在本地。然而,我的AJAX不是很好,我有一些问题 我已经编写了AJAX代码,它通过tweet向python函数发送POST请求,响应是整个python脚本。没有连接到脚本正在侦听的套接字。下面是AJAX函数和python脚本。知道发生了什么事吗 提前感谢您的帮助 $(function(){ $('#Po

我正在尝试建立一个网站,用户可以在其中输入文本,这些文本将通过javascript获取,并发送到python函数,然后发布到twitter上。目前,python函数与站点的其余部分一起存储在本地。然而,我的AJAX不是很好,我有一些问题

我已经编写了AJAX代码,它通过tweet向python函数发送POST请求,响应是整个python脚本。没有连接到脚本正在侦听的套接字。下面是AJAX函数和python脚本。知道发生了什么事吗

提前感谢您的帮助

$(function(){
    $('#PostTweet').on('click', function(e) {

    var tweet = document.getElementById("theTweet").value;
    var len = tweet.length;

    if(len > 140){
        window.alert("Tweet too long. Please remove some characters");
    }else{

        callPython(tweet);
    }     

    });

});

function callPython(tweet){
 window.alert("sending");
 $.ajax({
 type: "POST",
 url: "tweet.py",
 data: tweet,
 success: function(response){
    window.alert(response);
  }
 })
}
还有Python脚本:

from OAuthSettings import settings
import twitter
from socket import *

consumer_key = settings['consumer_key']
consumer_secret = settings['consumer_secret']
access_token_key = settings['access_token_key']
access_token_secret = settings['access_token_secret']

s = socket()
s.bind(('', 9999))
s.listen(4)
(ns, na) = s.accept()

def PostToTwits(data):    
   try:
     api = twitter.Api(
     consumer_key = consumer_key,
     consumer_secret = consumer_secret,
     access_token_key = access_token_key,
     access_token_secret = access_token_secret)

     api.PostUpdate(data)
     makeConnection(s)
   except twitter.TwitterError:
     print 'Post Unsuccessful. Error Occurred'


def makeConnection(s):
    while True:

       print "connected with: " + str(na)
       try:
           data = ns.recv(4096)
           print data
           PostToTwits(data)
       except:
           ns.close()
           s.close()
           break

makeConnection(s)

您的问题是您使用的是对HTTP协议一无所知的纯套接字。看一看微框架或web微框架,了解如何将python脚本或函数转换为web端点

您完全可以使用套接字编写一个简单的web服务器,事实上您已经这样做了。但这种方法很快就会变得单调乏味,除了简单的练习

例如,您的代码仅限于处理单个请求处理程序,这是问题的核心

post请求上的url错误。在您的设置中,没有url“tweet.py”的概念。如果您也从同一服务器为jquery所在的网页提供服务,那么该url实际上可以工作(但您不能)

您必须发布到“”,并且可以在“”、“”之后拥有任何所需的路径。只需确保首先从命令行运行python脚本,以便服务器正在侦听

另外,get和post请求之间的区别是HTTP协议的一部分,而您的简单服务器对此一无所知。这主要意味着在ajax请求中使用什么动词并不重要。服务器侦听所有HTTP谓词类型


最后,我没有看到任何数据被返回到客户端。您需要执行类似ns.sendall(“一些响应”)的操作。构建简单http服务器的教程比比皆是,并展示了发送响应的不同方式。

您需要一个web服务器,以便可以通过web浏览器发出请求

您可以使用flask或django之类的web框架,也可以使用webpy

从他们的网站上使用webpy的一个简单示例

import web

urls = (
    '/(.*)', 'hello'
)
app = web.application(urls, globals())

class hello:        
    def GET(self, name):
        if not name: 
            name = 'World'
        return 'Hello, ' + name + '!'

if __name__ == "__main__":
    app.run()

然后从javascript调用url(您的python函数)。

非常感谢!这似乎是有道理的,我会做一些研究!出于好奇,你知道在没有微框架的情况下这类事情是否可能发生吗?当然有可能,但正如@RobertMoskal在回答中所说的那样,这将变得单调乏味,而且有这么多的图书馆,我认为除了教育之外,没有理由这样做。如果您不想为此使用框架,请查看例如或哪些是python标准库的一部分。