HTTPOUT是Python文件的運行時環境。它允許您從Web URL執行Python腳本, print()輸出輸入瀏覽器。
這是將腳本部署到網絡的經典方式。您只需要將常規.py文件以及文檔根中的其他靜態文件放置,並且每個文件都可以從網絡中進行路由。無需服務器重新加載!
它為從網絡運行您的腳本提供了本地體驗。
httpout將分配每個路由,例如/hello.py或/index.py ,並使用名稱__main__ ,並將其相應的文件作為線程池中的模塊執行。通過劫持__import__ ,在模塊級進行猴子補丁。
在subsodules的角度上, __main__對象指向主模塊,例如/hello.py ,而不是指向sys.modules['__main__']或Web服務器本身。
HTTPOUT不執行諸如標準導入或SYS.Modules之類的緩存機制,以避免與其他模塊 /請求發生衝突。因為每個請求必須具有自己的命名空間。
為了使其簡單,只有主模塊被緩存(作為代碼對象)。緩存在HTTP保持距離期間將是有效的。因此,如果您只是更改腳本,則無需重新加載服務器進程,只需等到連接丟失。
請記住,這可能不適用於運行複雜的Python腳本,例如運行其他服務器進程或多線程應用程序,因為每個路由不是真正的主線程。
python3 -m pip install --upgrade httpout
# hello.py
import time
print ( '<pre>Hello...' )
time . sleep ( 1 )
print ( 'and' )
time . sleep ( 2 )
print ( 'Bye!</pre>' )將hello.py放在examples/文件夾中,然後使用以下方式運行HTTPOUT服務器
python3 -m httpout --port 8000 examples/
可以在http:// localhost:8000/hello.py訪問您的hello.py 。如果您不希望URL中的.py後綴,則可以在內部創建一個帶有index.py的hello/ folder。
這是如何查看請求方法並讀取表單數據的概述。
# form.py
import sys
from httpout import wait , request , response
method_str = request . environ [ 'REQUEST_METHOD' ]
method_bytes = request . method
if method_str != 'POST' :
response . set_status ( 405 , 'Method Not Allowed' )
print ( 'Method Not Allowed' )
sys . exit ()
# we can't use await outside the async context
# so wait() is used here because request.form() is a coroutine object
form_data = wait ( request . form ())
print ( method_str , method_bytes , form_data )它也可以以這種方式寫:
# form.py
import sys
from httpout import run , request , response
method_str = request . environ [ 'REQUEST_METHOD' ]
method_bytes = request . method
if method_str != 'POST' :
response . set_status ( 405 , 'Method Not Allowed' )
print ( 'Method Not Allowed' )
sys . exit ()
async def main ():
# using await instead of wait()
form_data = await request . form ()
print ( method_str , method_bytes , form_data )
run ( main ())那你可以做:
curl -d foo=bar http://localhost:8000/form.py
HTTPOUT設計為有趣。它不是為完美主義者建造的。 httpout有:
print() s立即通過行發送,而無需等待腳本像典型的CGI完成if-else和print()使您的腳本可用於CLI和Web重要的是要注意,HTTPOUT僅專注於請求安全;為了確保路徑穿越URL永遠不會發生。
httpout將永遠不會驗證您編寫的腳本,您仍然可以訪問os , eval() , open() ,甚至從文檔root中瀏覽的對象。因此,這個階段是您的責任。
僅供參考,PHP曾經有一種稱為安全模式的東西,但被認為是建築不正確的,因此他們將其刪除。
PHP安全模式是試圖解決共享服務器安全問題的嘗試。試圖在PHP級別解決此問題是架構上不正確的,但是由於Web服務器和OS級別的替代方案並不是很現實,因此許多人,尤其是ISP的替代方案,暫時使用安全模式。
麻省理工學院許可證