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的替代方案,暂时使用安全模式。
麻省理工学院许可证