2012-06-05 77 views
4

建立一個PHP腳本,響應一個Ajax請求一樣簡單:爲什麼PHP只能使用Ajax,但Python不能?

<?php 
    $command = $_POST["command"]; 
    if ($command == "say_hello") { 
    $name = $_POST["name"]; 
    echo json_encode(array("message" => "Hello, " . $name)); 
    } 
?> 

和,至少,如果你在客戶端使用jQuery,如果你對原請求指定一個回調函數,包含消息的數組將被傳入該回調函數。

但是對於Python來說並不那麼簡單。或者至少我還沒有想出如何使它變得簡單。如果我只是試圖「打印」一個響應(與上面的PHP「echo」聲明並行),客戶端不會收到任何迴應。

每當我在網上查看如何使用Python響應Ajax請求時,答案總是涉及使用Django或其他Web框架。

而且我知道這些東西都很棒,但是PHP的做法是什麼使得使用類似的軟件包變得不必要?我想用Python而不是PHP編寫我的服務器端腳本,但我更喜歡D.I.Y.爲什麼應該使用第三方框架(對嗎?)是一個非常簡單的任務。

任何幫助?如何做到這一點的例子將不勝感激。

+2

您需要設置您的服務器以便從Python程序提供數據。可以通過CGI,mod_python或使用WSGI(Python服務器網關接口)。 Python的標準庫附帶了[cgi模塊](http://docs.python.org/library/cgi.html),它是與Web服務器交互的基本方式。 – birryree

回答

12

但是用Python並不那麼簡單。或者至少我還沒有想出如何使它變得簡單。如果我只是試圖「打印」一個響應(與上面的PHP「echo」聲明並行),客戶端不會收到任何迴應。

我可能會有一些細節錯誤,但我會試着解釋爲什麼會出現這種情況。首先,你正在談論的PHP直接被燒入apache web服務器。當您執行echo時,它會將結果輸出到響應流(服務器和客戶端之間的TCP連接)。當您在python中執行print時,您所做的是將結果輸出到標準輸出(命令行)。

大多數語言是如何與Web協同工作的,就是請求進入某種Web服務器,並且Web服務器執行一個程序。該程序負責返回網絡服務器採用的流,並通過TCP連接流式傳輸到客戶端。

我假設web服務器將PHP標準重定向到web服務器流,這就是PHP如何使用echo來返回其結果。這是例外,而不是規則。

因此,要使用python來爲請求提供服務,您需要有一個可以以某種方式執行python的web服務器。這是傳統上使用CGI完成的。最近,像mod_python這樣的東西被用於在apache中託管python。如今,使用了wsgimod_wsgi,這是爲python與web服務器通信定義的標準。

你可能想看看像web.py這是一個極簡主義的python web框架。這會讓你非常接近你想要做的事情。

+0

擊敗我,以類似的解釋! :-P現在我覺得我有一個重複的答案 – ravenac95

+0

@ ravenac95非常接近。不同的是我建議web.py而不是燒瓶。很高興知道我在正確的軌道上:P –

2

有一個叫做json的python模塊。也許很多答案都涉及到框架(比如Django),因爲json是以網絡爲中心的,而Django,龍捲風,扭曲,cherrypy等等都是python與web交互的手段。

有很多不同的方法可以做到這一點,這些問題在其他問題中得到解決。然而,要回答你的問題,python有一個json library in its standard library

0

大多數PHP安裝程序默認配置它們自己,以通過運行腳本爲web目錄中的php文件提供服務。大多數Python安裝程序不會。服務於Python和Apache的最快方式:

  • 在你的Apache配置文件,添加AddHandler cgi-script .py到任何塊已經可以成爲PHP通過添加#文件
  • 家當你的Python腳本在/ usr/local/bin目錄/ Python或無論您的系統中的Python是什麼路徑
  • 記得首先打印標題,然後是換行符,然後是body。
  • 使用import cgi如果您想執行比發送迴應主體更復雜的任何操作。

請注意,這不是建議運行一個python的網站,只是快,PHP上下的方式方式。

0

Richardhsu的正確性。

本質上python是一種通用的腳本語言。因此,它需要一種連接到網絡的方式,例如通過打開一個端口和進行網絡編程等。您還可以使用CGI附加到Apache或其他Web服務器。

這與Java,Ruby,Perl或C/C++如何進入網絡並無二致。事實上,PHP做的事情很多。它與CGI的接口更緊密。

如果您想從命令行解釋PHP或編譯PHP,那麼您現在就會遇到與Python相同的問題。問題不在於PHP與Python,而在於如何使用HTTP協議將所選的腳本語言連接到互聯網。

4

從一開始,PHP就是在構建Web時考慮到的。相反,Python被設計爲通用語言。

當您從PHP回顯時,您實際上正在寫入一個作爲HTTP響應的一部分發送給用戶的流。在python中執行打印時,默認情況下,輸出寫入stdout流,這意味着不是通過http向用戶發送輸出,而是將輸出寫入控制檯(或者此刻捕獲stdout的任何內容)。

所以對於PHP來說,HTTP是一個一流的公民。適用於更多通用語言,如Python,Ruby,Erlang,C,C++和其他許多語言。你必須以不同的方式與HTTP通信。 PHP已經通過Apache的mod_php或類似PHP-FPM來處理這種通信。

的sooo ....

至於創建您自己的服務器端腳本,我會強烈建議反對它作爲Python的框架採取PHP是建立在該層的位置。所以用Python自己創建符合標準的http服務器並不會很簡單。之所以這麼辛苦,是因爲你不得不與CGI或WSGI(用於處理Web的Python標準)進行接口,或者創建自己的HTTP服務器。如果你認爲你能勝任這個任務,那麼我強烈建議!你可能會學到很多東西,但這不會是最簡單的。偉大的事情是,很多圖書館已經爲你處理這種溝通。例如,如果你正在尋找輕量級的東西,我強烈建議像flask這樣的微型框架,如果我需要一些非常簡單的東西,我個人會使用它。開始比django容易得多,但它也包含更少的電池。

希望這會有所幫助!

相關問題