我想創建使用Django框架的網站。我查看了Django項目網站上的教程,但包含了許多我不需要的信息。我有提供輸出的Python腳本,我需要在Web上有這個輸出。我的問題是如何簡單地管理Django的鏈接來啓動腳本並在網絡上提供其輸出,或者您可以提供鏈接,以便我可以閱讀這些內容?Python的Django簡單網站
謝謝。
我想創建使用Django框架的網站。我查看了Django項目網站上的教程,但包含了許多我不需要的信息。我有提供輸出的Python腳本,我需要在Web上有這個輸出。我的問題是如何簡單地管理Django的鏈接來啓動腳本並在網絡上提供其輸出,或者您可以提供鏈接,以便我可以閱讀這些內容?Python的Django簡單網站
謝謝。
「我有python腳本,它提供了 輸出,我需要在網絡上有這個輸出 。」
這不是Django的用處。你想做的事可以用這樣簡單的東西來實現什麼:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write("magic content goes here")
if __name__=="__main__":
try:
server = HTTPServer(("", 8080), Handler)
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()
觀察self.wfile.write
線。無論你寫什麼,最終都會在瀏覽器中出現。如果重要,可以使用Handler
中的self.path
來檢查請求的文件。
經過Python 2.6.4測試,使用Chrome瀏覽器訪問服務器。
這不是Django的工作原理。做這個教程,你會節省很多時間和挫折感。
我有python腳本提供輸出,我需要在網絡上有這個輸出。
什麼是Django?使用python上的CGI腳本(可能你已經有一個)或WSGI應用程序(這有點難以部署)
Django是一個框架工作。只需使用CGI腳本。
大家都說得對。這是使用django的錯誤方法。但是,如果你需要一個權宜之計,而你轉換你的腳本到正確的成語:
import sys
from django.http import HttpResponse
def cgi_view(request, my_module):
__import__(my_module)
mod = sys.modules[my_module]
text = mod.main()
resp = HttpResponse(text)
# Then set your headers on resp
return resp
我把它作爲一個練習,找出如何設置的標頭。對不起懶惰,但我得去工作。
P.S.如果您的腳本沒有考慮將所有輸出生成函數包含在main()函數中,則可以使用subprocess來獲取輸出。
將mod_wsgi插件用於Apache。
您可以這樣做來查看現有腳本如何轉換爲WSGI應用程序。這是一個起點,以顯示WSGI接口如何工作。
import sys
def myWSGIApp(environ, start_response):
with file("temp", "w") as output:
sys.stdout= output
execfile("some script.py")
sys.stdout= __stdout__
status = '200 OK'
headers = [('Content-type', 'text/plain')]
start_response(status, headers)
result= file("temp", "r")
return result
請注意,您可以輕鬆地重寫你的腳本符合WSGI 標準,也。這仍然不是最好的方法。
如果你有這個
if __name__ == "__main__":
main()
您只需像這樣添加到每個腳本。
def myWSGIApp(environ, start_response):
with file("temp", "w") as output:
sys.stdout= output
main()
sys.stdout= __stdout__
status = '200 OK'
headers = [('Content-type', 'text/plain')]
start_response(status, headers)
result= file("temp", "r")
return result
然後,每個腳本是可調用作爲應用WSGI和可以插入 到基於WSGI的框架。
最好的方法是重寫您的腳本,以便它們不使用sys.stdout
,而是寫入傳遞給它們的文件作爲參數。
服務器的測試版本可以這麼簡單。
from wsgiref.simple_server import make_server
httpd = make_server('', 8000, myWSGIApp)
一旦你有你的腳本WSGI應用程序,你可以創建一個更聰明 WSGI應用程序,
解析URL。使用要運行的腳本的名稱更新環境。
用適當的環境運行你的WSGI應用程序。
查看http://docs.python.org/library/wsgiref.html的信息。
然後,您可以配置Apache以通過mod_wsgi
使用WSGI服務器。詳細請看http://code.google.com/p/modwsgi/。
您不應該從WSGI應用程序返回一個文件對象作爲可迭代對象,因爲WSGI堆棧需要每次發送一個返回的項目,並在它們之間刷新以觸發立即發送回客戶端。由於文件迭代一次只返回一個字符,因爲響應一次只發送一個字符,所以性能會很差。您替換sys.stdout的技術也不是線程安全的,並且在典型的多線程WSGI託管機制中不起作用。 – 2010-02-09 22:30:17
進一步\ _ \ _ stdout \ _ \ _與mod_wsgi下的stdout不同,因爲mod_wsgi將特殊文件對象替換爲標準輸出,從而導致輸出通過Apache錯誤日誌。通過恢復\ _ \ _ stdout \ _ \ _,您將導致可能會丟失信息,其中stdout用於在該代碼段的上下文之外進行日誌記錄。 – 2010-02-09 22:31:35
另一種方法是使用'subprocess.Popen'只是稍微複雜一些,但可能更安全。 – 2010-02-09 23:24:27
我知道,但我要創建具有大量信息的Web服務器,這只是初始信息,如果我決定使用Django作爲Web框架來存儲表單,從數據庫獲取信息,那麼我正在尋找也是通過Django處理這些簡單事情的方式。 – yart 2010-02-09 12:52:12