HTTPOUT هي بيئة وقت التشغيل لملفات Python. يتيح لك تنفيذ البرامج النصية Python الخاصة بك من عنوان URL على الويب ، ينتقل إخراج print() إلى متصفحك.
هذه هي الطريقة الكلاسيكية لنشر البرامج النصية الخاصة بك على الويب. تحتاج فقط إلى وضع ملفات .py العادية بالإضافة إلى الملفات الثابتة الأخرى في جذر المستند وسيكون كل منها قابلاً للتوجيه من الويب. لا يلزم إعادة تحميل الخادم!
يوفر تجربة أصلية لتشغيل البرنامج النصي من الويب.
ستقوم HTTPOUT بتعيين كل مسار إما مثل /hello.py أو /index.py مع الاسم __main__ وتنفيذ ملفه المقابل كوحدة في تجمع مؤشرات الترابط. يتم تصحيح القرد على مستوى الوحدة النمطية من خلال اختطاف __import__ .
في منظور النظام الفرعي ، يشير كائن __main__ إلى الوحدة الرئيسية مثل /hello.py ، بدلاً من الإشارة إلى sys.modules['__main__'] أو خادم الويب نفسه.
لا يقوم HTTPOUT بإجراء آلية ذاكرة التخزين المؤقت مثل الواردات القياسية أو مع sys.modules لتجنب النزاعات مع الوحدات / الطلبات الأخرى. لأن كل طلب يجب أن يكون له مساحة الاسم الخاصة به.
للحفاظ على الأمر بسيطًا ، يتم تخزين الوحدة الرئيسية فقط (ككائن رمز). ستكون ذاكرة التخزين المؤقت صالحة أثناء HTTP Keep-Alive. لذلك إذا قمت فقط بتغيير البرنامج النصي ، فلا داعي لإعادة تحميل عملية الخادم ، فما عليك سوى الانتظار حتى يتم فقدان الاتصال.
ضع في اعتبارك أن هذا قد لا يعمل لتشغيل البرامج النصية المعقدة 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/
ويمكن الوصول إلى hello.py على http: // localhost: 8000/hello.py. إذا كنت لا تريد لاحقة .py في عنوان URL ، يمكنك بدلاً من ذلك إنشاء مجلد hello/ Folder مع index.py في الداخل.
هذه نظرة عامة على كيفية عرض طرق الطلب وقراءة بيانات النموذج.
# 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() على الفور سطر سطر دون انتظار أن ينتهي البرنامج النصي مثل CGI النموذجيif-else و print() مما يجعل البرنامج النصي محمولًا لكل من CLI و Webمن المهم أن نلاحظ أن httpout يركز فقط على طلب الأمن ؛ للتأكد من أن المسار اجتياز عبر عنوان URL لا يحدث أبدًا.
لن يتحقق HttPout أبدًا من صحة البرنامج النصي الذي تكتبه ، ولا يزال بإمكانك الوصول إلى كائنات مثل os ، eval() ، open() ، وحتى اجتياز جذر المستند. لذلك هذه المرحلة هي مسؤوليتك.
FYI ، اعتادت PHP أن يكون لها شيء يسمى الوضع الآمن ، ولكن كان يعتبر غير صحيح من الناحية المعمارية ، لذلك قاموا بإزالته.
وضع PHP Safe هو محاولة لحل مشكلة أمن الخادم المشترك. من غير الصحيح من الناحية المعمارية محاولة حل هذه المشكلة على مستوى PHP ، ولكن نظرًا لأن البدائل في خادم الويب ومستويات نظام التشغيل ليست واقعية للغاية ، فإن العديد من الأشخاص ، وخاصة ISP ، تستخدم الوضع الآمن في الوقت الحالي.
رخصة معهد ماساتشوستس للتكنولوجيا