2015-08-27 15 views
2

我正在嘗試構建一個網站,用戶可以在其中輸入文本,這些文本將通過javascript接收,併發送到一個python函數,併發布到twitter。目前,python函數正在本地存儲,以及其他站點。但是,我的AJAX不是太好,我有幾個問題。使用AJAX在本地發送數據到Python函數

我已經寫了AJAX代碼,它向tweet發送一個POST請求到python函數,響應是整個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) 

回答

0

你的問題是,你與哪些一無所知HTTP協議的純插座工作。看看FlaskBottle網頁微觀框架,看看如何將python腳本或功能變成網絡端點。

+0

非常感謝!這似乎是有道理的,我會做一些研究!出於好奇,你知道沒有微觀框架,這種事情是否可能? – CHByte

+0

當然這是可能的,但正如@RobertMoskal在他的回答中所說的那樣會很乏味,而且有那麼多的圖書館,除了教育之外,我沒有理由這樣做。如果您不想爲此使用框架,請查看[wsgiref](https://docs.python.org/2/library/wsgiref.html#wsgiref.util.setup_testing_defaults)或[BaseHTTPServer](https://docs.python.org/2/library/basehttpserver.html #module-BaseHTTPServer),它們是Python標準庫的一部分。 – beezz

0

你完全可以使用套接字編寫一個簡單的Web服務器,事實上你已經這樣做了。但這種方法很快就會變得乏味,除了一個簡單的練習之外的任何事情。

例如,您的代碼僅限於處理單個請求處理程序,而這個請求處理程序會成爲問題的核心。

帖子請求中的網址錯誤。在你的設置中,沒有URL「tweet.py」的概念。如果你也在服務jquery從同一個服務器(但你不可以)居住的網頁,那麼這個url實際上可以工作。

您必須發佈到「http://localhost:9999」,並且在「http://localhost:9999/foo」,「http://localhost:9999/boo」之後您可以使用任何路徑。只要確保你先從命令行運行python腳本,那麼服務器正在監聽。

get和post請求之間的區別是HTTP協議的一部分,您的簡單服務器不知道任何有關的信息。這主要意味着你在ajax請求上使用什麼動詞並不重要。您的服務器偵聽所有HTTP動詞類型。

最後,我沒有看到任何數據被返回給客戶端。你需要做一些事情,比如ns.sendall(「某些迴應」)。用於構建簡單http服務器的教程比比皆是,並顯示發送響應的不同方式。

0

您需要一個網絡服務器,以便您可以通過網絡瀏覽器發出請求。

你可以像web或框架像燒瓶或Django的,或者你可以使用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() 

然後調用URL從JavaScript(你的Python功能)一個簡單的例子。