
سريع ، لا يعلن ويب سيرت إيه
يجعل QuickServ إنشاء تطبيقات ويب سهلة بشكل خطير ، بغض النظر عن لغة البرمجة التي تستخدمها.
QuickServ هو خادم ويب واحد خالٍ من التبعية ، يرتبط بشكل ثابت ، والذي:
read write يجلب Quickserv المتعة المليئة بالإنترنت في التسعينيات إلى 2020s. إنه مستوحى من واجهة البوابة المشتركة (CGI) ، ولكن من الأسهل بكثير الإعداد والاستخدام. على عكس CGI ، فإنه يعمل خارج المربع دون البحث عن ملفات السجل الغامضة ، ولا يتعلم كيفية عمل رؤوس HTTP ، ولا تتناقص مع أجزاء الإذن ، ولا تقلق بشأن الكورس ، ولا تتساءل عن مكان وضع البرامج النصية الخاصة بك ، ولا تكافح مع تكوينات Apache mod_cgi .
على عكس CGI ، لا يتعين عليك معرفة أي شيء من الفقرة السابقة يعني استخدام QuickServ.
إنه مثالي لـ:
لا ينبغي استخدام QuickServ على الإنترنت العام. يجب استخدامه فقط على الشبكات الخاصة.
يعد استخدام QuickServ سهلاً مثل تنزيل البرنامج ، وسحبه إلى مجلد المشروع ، والنقر المزدوج للتشغيل. يكتشف تلقائيًا الملفات التي سيتم تنفيذها ، والتي تعمل مباشرة على المستخدم.
قم بتنزيل Windows.
قم بعمل مجلد للمشروع وأضف ملفات إليه. على سبيل المثال ، إذا تم تثبيت Python ، قم بإنشاء ملف يسمى test.py في مجلد المشروع يحتوي على:
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
منذ أن يبدأ test.py بـ #!something ، حيث something test.py هو الأمر لتنفيذ الملف ، ستعرف QuickServ تشغيله. إذا لم يتم تشغيل QuickServ من ملفك ، فتأكد من إضافة هذا إلى البداية.
على Windows ، يعرف QuickServ أيضًا تشغيل الملفات التي تنتهي تلقائيًا في .exe و .bat . يجب أن يبدأ أي نوع ملف آخر بـ #!something إذا كان يجب تشغيله.
انقل ملف quickserv_windows_x64.exe الذي تم تنزيله إلى مجلد المشروع.

انقر نقرًا مزدوجًا quickserv_windows_x64.exe في مجلد المشروع لبدء QuickServ. السماح للوصول من خلال Windows Defender إذا تمت مطالبته.


انتقل إلى http://127.0.0.1:42069 (أو العنوان الذي يظهره QuickServ) للاتصال بتطبيق الويب الخاص بك. في المثال ، لتشغيل test.py ، انتقل إلى http://127.0.0.1:42069/test.py.

قم بتنزيل الإصدار المناسب لجهاز الكمبيوتر الخاص بك. إذا لزم الأمر ، تحقق من نوع المعالج الذي لدى MAC. سيتعين عليك إلغاء ضغط الملفات بعد تنزيلها.
قم بعمل مجلد للمشروع وأضف ملفات إليه. على سبيل المثال ، إذا تم تثبيت Python ، قم بإنشاء ملف يسمى test.py في مجلد المشروع يحتوي على:
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
إذا كنت تقوم بإنشاء الملف باستخدام TextedIt ، فستحتاج إلى الانتقال إلى Format > Make Plain Text لحفظ الملف بالتنسيق الصحيح.

منذ أن يبدأ test.py بـ #!something ، حيث something test.py هو الأمر لتنفيذ الملف ، ستعرف QuickServ تشغيله. إذا لم يتم تشغيل QuickServ من ملفك ، فتأكد من إضافة هذا إلى البداية.
على Mac ، يعرف QuickServ أيضًا تشغيل الملفات تلقائيًا تم تجميعها. يجب أن يبدأ أي نوع ملف آخر بـ #!something إذا كان يجب تشغيله.
انقل ملف quickserv_macos_x64 الذي تم تنزيله أو ملف quickserv_macos_arm64 إلى مجلد المشروع.
انقر بزر الماوس الأيمن على quickserv_macos_x64 أو quickserv_macos_arm64 في مجلد المشروع وحدد "Open." ثم ، اضغط على "فتح" في مربع الحوار التأكيد. بعد تشغيله بهذه الطريقة مرة واحدة ، ستتمكن من بدء تشغيل QuickServ ببساطة عن النقر المزدوج على الملف.



انتقل إلى http://127.0.0.1:42069 (أو العنوان الذي يظهره QuickServ) للاتصال بتطبيق الويب الخاص بك. في المثال ، لتشغيل test.py ، انتقل إلى http://127.0.0.1:42069/test.py.

من الأسهل التثبيت والتشغيل عبر سطر الأوامر. افتح المحطة.
أدخل الأوامر التالية. قد تكون هناك حاجة إلى كلمة مرور للأوامر الأولى.
# Download
sudo curl
--location
--output /usr/local/bin/quickserv
https://github.com/jstrieb/quickserv/releases/latest/download/quickserv_raspi_arm
# Make executable
sudo chmod +x /usr/local/bin/quickserv
# Make a project folder
mkdir -p my/project/folder
# Go to project folder
cd my/project/folder
# Add a test file
cat << EOF > test.py
#!python3
# Put your code here. For example:
import random
print(random.randint(0, 420))
EOF
# Run QuickServ
quickserv انتقل إلى http://127.0.0.1:42069 (أو العنوان الذي يظهره QuickServ) للاتصال بتطبيق الويب الخاص بك. على سبيل المثال ، لتشغيل test.py ، انتقل إلى http://127.0.0.1:42069/test.py.
لا يوجد لدى النقر على تشغيل شركة Executizes سلوك ثابت عبر Linux Distros ، لذلك من الأسهل التثبيت والتشغيل عبر سطر الأوامر. اعتمادًا على بنية جهاز الكمبيوتر الخاص بك ، قد يكون من الضروري تغيير اسم الملف في نهاية عنوان URL لطلب HTTP curl أدناه.
شاهد جميع خيارات التنزيل على صفحة الإصدارات.
# Download
sudo curl
--location
--output /usr/local/bin/quickserv
https://github.com/jstrieb/quickserv/releases/latest/download/quickserv_linux_x64
# Make executable
sudo chmod +x /usr/local/bin/quickserv
# Make a project folder
mkdir -p /my/project/folder
# Go to project folder
cd /my/project/folder
# Add a test file
cat << EOF > test.py
#!python3
# Put your code here. For example:
import random
print(random.randint(0, 420))
EOF
# Run QuickServ
quickserv انتقل إلى http://127.0.0.1:42069 (أو العنوان الذي يظهره QuickServ) للاتصال بتطبيق الويب الخاص بك. على سبيل المثال ، لتشغيل test.py ، انتقل إلى http://127.0.0.1:42069/test.py.
بدلاً من ذلك ، استخدم الإرشادات أدناه لتجميع من المصدر.
تجميع وتثبيت من المصدر باستخدام الأمر التالي. مطلوب إصدار من GO أكبر من 1.16 بسبب التبعية على أنظمة الملفات المضمنة.
go install github.com/jstrieb/quickserv@latestثم قم بإنشاء مجلد المشروع الخاص بك ، وملءه ، وقم بتشغيل QuickServ.
# Make a project folder
mkdir -p /my/project/folder
# Go to project folder
cd /my/project/folder
# Add a test file
cat << EOF > test.py
#!python3
# Put your code here. For example:
import random
print(random.randint(0, 420))
EOF
# Run QuickServ
quickservلإظهار الميزات الرئيسية لـ QuickServ ، سنقوم ببناء تطبيق ويب بسيط لأداء الإضافة. لن يتبع الكود أفضل الممارسات ، ولكنه سيظهر مدى ضرورة البدء في البناء باستخدام QuickServ.
أولاً ، نقوم بإنشاء مجلد مشروع وسحب QuickServ القابل للتنفيذ في المجلد ، كما هو الحال في خطوات البدء.
بعد ذلك ، داخل المجلد ، نقوم بحفظ النص التالي مثل index.html :
< form action =" /calculate " >
< input name =" first " type =" number " > + < input name =" second " type =" number " > = ???
< br >
< button > Calculate </ button >
</ form > يقدم هذا الرمز متغيرين إلى صفحة /calculate . في المتصفح ، يبدو هكذا:

ثم ، نقوم بإنشاء مجلد يسمى calculate داخل مجلد المشروع. داخل المجلد calculate ، نقوم بحفظ الكود التالي مثل index.py . اسم index.whatever يخبر QuickServ بتشغيل هذا الملف عندما يزور المستخدم http://website/calculate بدلاً من الحاجة إليها لزيارة http://website/calculate/index.py .
إيلاء اهتمام خاص لتعليقات الرمز. يسلطون الضوء على عدد من ميزات QuickServ المهمة.
#!python3
# Each QuickServ script must begin with a line like the one above so that
# QuickServ knows how to run the file. This line tells QuickServ that I would
# type `python3 this_file.py` to run this file at the command prompt. For
# example, if you wanted to do `julia this_file.py` instead, then you would
# make the first line of `this_file.py` be `#!julia`.
#
# Since we just want QuickServ to show the HTML code to the user and not run
# it, index.html does not begin with this. The first line is only required when
# QuickServ has to run the code.
import argparse
# All HTML form values get turned into command line arguments. The names are
# formatted like "--name" and the value comes right after the name.
parser = argparse . ArgumentParser ()
parser . add_argument ( "--first" , type = int , required = True )
parser . add_argument ( "--second" , type = int , required = True )
args = parser . parse_args ()
# Print the result -- anything printed out goes right to the user. In this
# case, the output is text. But you can print anything and QuickServ will guess
# the file type. Even printing the contents of image and video files works.
print ( args . first + args . second )الآن انقر نقرًا مزدوجًا على QuickServ في مجلد المشروع الخاص بك وجربه في متصفحك. هذا كل شيء!
راجع الأمثلة المرتبطة في القسم التالي لمزيد من المظاهرات السريعة. اقرأ المزيد من التفاصيل في قسم كيفية عمله ، وفي الكود نفسه. يحتوي القسم المتقدم على معلومات إضافية حول إعداد البيئة QuickServ للمناصرين التنفيذيين التي يتم تشغيلها.
توجد جميع الأمثلة في مجلد examples ، وهي وحدة فرعية git متصلة بـ JSTRIEB/QuickServ-explames repo. انتقل إلى هذا الريبو لمزيد من المعلومات حول كيفية تشغيل الأمثلة.
بعض النقاط البارزة:
| ملخص | لغة | النوافذ | ماك | Linux |
|---|---|---|---|---|
| يوتيوب إلى GIF | صدَفَة | |||
| إنشاء مرشحات بلوم | ج | |||
| قائمة الأفلام المتزامنة | TypeScript | |||
| مترجم Brainfuck | x86-64 التجميع | |||
| Mandelbrot Zoom | صدَفَة | |||
| لوحة القيادة cryptocurrency | يذهب | |||
| أدوات PDF | بيثون | |||
| تخفيض الأنسجة مثل PDF | قياسي مل |
يعيش كل رمز Quickserv في quickserv.go . يبلغ طول هذا الملف الذي تم تعويضه جيدًا حوالي 700 سطر ، ويجب أن يأخذ مبرمجًا متمرسًا بدون ألفة Golang في الساعة على الأكثر للقراءة.
QuickServ لديه جزأين رئيسيين. الأول هو إجراء التهيئة ، يتم تشغيله مرة واحدة في بدء التشغيل. والثاني هو وظيفة المعالج ، تسمى في كل مرة يقدم المستخدم طلب HTTP إلى الخادم.
عند بدء تشغيل QuickServ ، فإنه يتحقق من أعلام تكوين سطر الأوامر ، ويفتح ملف السجل إذا تم تمرير واحد مع- --logfile (وإلا فإنه يسجل إلى الإخراج القياسي) ، ويغير الدلائل إذا تم تمرير دليل العمل مع- --dir . لاحظ أن مسار ملف السجل مرتبط بدليل العمل الحالي ، وليس بالنسبة إلى المسار الذي تم تمريره مع --dir .
بعد ذلك ، يقوم QuickServ بمسح دليل العمل لتشغيل الملفات. يطبع جميع الملفات التي سيتم تنفيذها. هذا السلوك مفيد لتحديد ما إذا كان QuickServ يتعرف على البرنامج النصي على أنه قابل للتنفيذ. كما يطبع معلومات مفيدة للمستخدم مثل عنوان الويب لزيارة للوصول إلى الخادم ، والمجلد الذي يعمل فيه الخادم ، وكذلك كيفية إيقافه.
في حالة فشل أي جزء من التهيئة ، يتم الإبلاغ عن خطأ. في حالة حدوث خطأ فادح ، ينتظر QuickServ إدخال المستخدم قبل الإقلاع عنه. وبهذه الطريقة ، لا يظهر المستخدم الذي ينقر نقرًا مزدوجًا على القابلين للتنفيذ (على عكس بدء تشغيله من سطر الأوامر) على نافذة ، ثم يختفي على الفور ، ويومض بسرعة كبيرة حتى يتم قراءة الخطأ.
تتم كتابة رسائل الخطأ عن قصد مع القليل من المصطلحات التقنية قدر الإمكان ، على الرغم من أن بعضها لا مفر منه. يتم تضمين الأسباب المحتملة للأخطاء أيضًا في رسائل الخطأ ، بحيث يكون من الأسهل على المستخدمين تحديدها وإصلاحها.
كخطوة الأخيرة في إجراء التهيئة ، تبدأ QuickServ خادم ويب مع وظيفة معالج واحد لجميع الطلبات. يستمع الخادم على المنفذ الافتراضي لـ 42069 ، أو على منفذ عشوائي إذا حدد مستخدم علامة سطر أوامر --random-port . سيكون من المرغوب فيه منفذًا عشوائيًا إذا اضطر المستخدم إلى إظهار مشروع تم تصميمه باستخدام Quickserv لشخص لا فكاهي ، على سبيل المثال.
عندما يزور المستخدم صفحة ويب ، يتعامل QuickServ مع الطلب عن طريق الاتصال بوظيفة المعالج الوحيد.
أولاً ، تحاول هذه الوظيفة فتح الملف الذي طلبه المستخدم. إذا لم تتمكن من العثور على الملف أو فتحه ، فإنه يحاول تقديم إصدار افتراضي من الملف. على سبيل المثال ، هناك favicon.ico متضمنة. إذا لم يكن هناك ملف افتراضي يتطابق مع المسار ، فإنه يتيح لـ Fileserver المدمج التعامل مع الخطأ والرد برمز خطأ 404.
إذا كان الملف الذي طلبه المستخدم موجودًا ، فإنه يتحقق مما إذا كان دليلًا. إذا كان دليلًا ، فإن QuickServ يبحث عن ملف يسمى index.xxx حيث يكون xxx أي تمديد ملف. إذا تم العثور على ملف فهرس ، يتم تقديم الفهرس (وربما ينفذ) كما لو كانت الصفحة الأصلية المطلوبة. خلاف ذلك ، يجب أن يكون المستخدم قد طلب دليلًا بدون فهرس افتراضي ، لذلك يستجيب QuickServ مع قائمة الملفات الأخرى في الدليل.
إذا كان الملف الذي طلبه المستخدم موجودًا وليس دليلًا ( أي ملف منتظم) ، فإن QuickServ يتحقق مما إذا كان قابل للتنفيذ أم لا. إذا كان الأمر كذلك ، فإنه ينفذ الملف الذي وجدته. إذا لم يكن كذلك ، فإنه يعيد محتويات الملف الخام إلى المستخدم. في كلتا الحالتين ، سوف يخمن QuickServ ما هو filetype (وبالتالي التي mimetype ) لاستخدامها للاستجابة.
تعتمد تقنية تحديد ما إذا كان الملف قابل للتنفيذ على نظام تشغيل وقت التشغيل. على Windows ، يعتبر أي ملف مع امتداد .bat أو .exe قابل للتنفيذ. على أنظمة غير Windows ، يعتبر أي ملف لديه مجموعة بتات قابلة للتنفيذ قابلة للتنفيذ. على جميع الأنظمة ، يكون الملف قابلًا للتنفيذ إذا كان يحتوي على شبانج زائف صالح في البداية. يجب أن يكون Shebang على السطر الأول ، يجب أن يبدأ بـ #! ، ويجب أن يكون أمر صالح. على سبيل المثال ، كلا التاليين مقبولان ، على افتراض أن python3 مثبت وعلى PATH :
#!/usr/bin/python3#!python3 لتنفيذ ملف ، يقوم QuickServ إما بتشغيل الملف نفسه (إذا كان .exe أو يحتوي على مجموعة بت قابلة للتنفيذ) ، أو يمرر مسار الملف كوسيطة أول إلى القائمة القابلة للتنفيذ في Shebang. يتم تمرير هيئة الطلب إلى البرنامج على الإدخال القياسي ، ويتم طباعة كل شيء مطبوع بواسطة البرنامج على الإخراج القياسي كهيئة استجابة. البرامج التي تم تنفيذه ليست مسؤولة عن الكتابة - غير قادرة على الكتابة - رؤوس استجابة HTTP.
جميع متغيرات نموذج HTTP المحسورة (إذا كان Content-Type هو x-www-form-urlencoded ) يتم تمريره أيضًا كوسيط لسطر الأوامر عند تنفيذ البرنامج. بهذه الطريقة ، لا يحتاج المستخدم إلى تحليل المتغيرات نفسها.
أيا كان ما يتم تسجيل مطبوعات البرنامج المنفذة على الخطأ القياسي بواسطة QuickServ ، مما يعني أنه يتم طباعته في نافذة وحدة التحكم افتراضيًا. هذا مفيد للتصحيح. إذا انتهى البرنامج برمز خروج غير صفري ، فإن QuickServ يستجيب بخطأ خادم داخلي 500. وإلا فإنه يعود مع 200.
إذا كان الطلب عبارة عن طلب نشر مشفر عن عنوان URL مع بيانات النموذج ، فإن QuickServ URL-Decodes جميع الأحرف باستثناء ثلاثة رموز: % ، & ، و = . المستخدم مسؤول عن استبدال هذه. لاحظ أنه من المهم دائمًا أن تدوم url-decode % في البرنامج الذي يعالج بيانات النموذج.
لا تقم بتشغيل Quickserv على الإنترنت العام. تشغيله فقط على الشبكات الخاصة.
QuickServ غير مصمم لاستخدام الإنتاج. لم يتم إنشاؤها لتكون سريعة أو آمنة. إن استخدام QuickServ في الإنتاج يعرض المستخدمين ونفسك للخطر ، يرجى عدم القيام بذلك.
يتيح Quickserv للناس بناء أشياء غير آمنة بشكل خطير. لا يعقد أي مدخلات أو مخرجات. يستخدم عملية واحدة لكل طلب ، وهو عرضة لهجوم رفض الخدمة. يفترض نموذج الأمان الخاص به أن مستخدمي الويب جدير بالثقة. هذه الخصائص تجعل النماذج الأولية أسهل ، ولكنها ليست آمنة على الإنترنت العام.
لردع باستخدام Quickserv في الإنتاج ، يعمل على المنفذ 42069 . نأمل أن يجعل الجميع يفكرون مرتين قبل إدخاله في وكيل عكسي أو تهيئة للأمام. للحصول على عرض تجريبي أكثر احترافًا ، سيستخدم علامة سطر القيادة- --random-port بدلاً من ذلك منفذًا عشوائيًا ، يتم تحديده في وقت التشغيل.
يشبه QuickServ بروتوكول CGI القديم. هناك العديد من الأسباب الراسخة التي يتم جمعها بشكل جيد بأن CGI سيئة في الإنتاج ، وكلها تنطبق على Quickserv في الإنتاج.
لدى QuickServ خيارات متقدمة تم تكوينها عبر أعلام سطر الأوامر. هذه تغير كيف وأين يعمل Quickserv ، وكذلك المكان الذي يحفظ فيه إخراجها.
Usage:
quickserv [options]
Options:
--dir string
Folder to serve files from. (default ".")
--logfile string
Log file path. Stdout if unspecified. (default "-")
--no-pause
Don't pause before exiting after fatal error.
--random-port
Use a random port instead of 42069.
في تقليد CGI ، يتم تمرير رؤوس HTTP إلى البرنامج الذي تم تنفيذه كمتغيرات بيئة. سيتم تعيين رأس يسمى Header-Name كمتغير البيئة HTTP_HEADER_NAME .
يوجد أيضًا متغير REQUEST_TYPE يحدد ما إذا كان الطلب قد تم GET POST وما إلى ذلك .
تطلب HTTP مع هيئة تمرير الجسم إلى البرنامج الذي تم تنفيذه على المدخلات القياسية. في معظم الحالات ، يتم تمرير جسم الطلب حرفيًا. هذا ليس هو الحال بالنسبة لأشكال HTML.
يمكن قراءة بيانات نموذج HTML من وسيطات سطر الأوامر ، كما في البرنامج التعليمي ، أو تحليلها من الإدخال القياسي. المتغيرات تأخذ النموذج
name=value&othername=othervalue
يمكن إعادة كتابة مثال الإضافة البسيط من البرنامج التعليمي لتحليل قيم نموذج HTTP من الإدخال القياسي بدلاً من وسيطات سطر الأوامر.
#!python3
import sys
# In the form input, "=" and "&" determine where variables start and end. So if
# they are literally included in the variable name or value, they must be
# specially decoded. This code replaces every instance of the text on the left
# with the text on the right to do the decoding:
# %3D -> =
# %26 -> &
# %25 -> %
#
# NOTE: Order matters! "%" must be decoded last. If not, it can mess with
# decoding the others, since their encoded version uses "%"
def decode_characters ( text ):
text = text . replace ( "%3D" , "=" )
text = text . replace ( "%26" , "&" )
text = text . replace ( "%25" , "%" )
return text
first = second = 0
# Read all of the input into a variable. We are expecting the raw data to look
# like:
# first=123&second=456
data = sys . stdin . read ()
# The raw data looks like the above, so split it into pairs at each "&"
pairs = data . split ( "&" )
for pair in pairs :
# Each pair looks like the following, so split at each "=":
# name=value
name , value = pair . split ( "=" )
# Decode any special characters (=, &, %) now that we have split the
# variables up. This isn't necessary here since we're expecting numbers and
# not expecting any of those characters. But it matters a lot when a user
# could submit text with those characters
name = decode_characters ( name )
value = decode_characters ( value )
# If the name is what we're looking for, store the value for adding
if name == "first" :
first = int ( value )
elif name == "second" :
second = int ( value )
# Print the result -- anything printed out goes right to the user. In this
# case, the output is text. But you can print anything and QuickServ will try and
# guess the file type.
print ( first + second )تم تطوير هذا المشروع وصيانته بنشاط. إذا لم تكن هناك ارتباطات حديثة ، فهذا يعني أن كل شيء يعمل بسلاسة!
يرجى فتح مشكلة مع أي أخطاء أو اقتراحات أو أسئلة. يتضمن ذلك بشكل خاص مناقشات حول كيفية جعل رسائل الخطأ واضحة قدر الإمكان ، وكيفية جعل الإعدادات الافتراضية قابلة للتطبيق على أكبر عدد ممكن من المستخدمين.
سيتم تجاهل طلبات السحب دون مناقشة مسبقة - لا تضيع الوقت في كتابة رمز قبل التأكيد على أنه سيتم دمجها. كمطور مزدحم وحيد ، من الأسهل أن تكون متجاوبة عندما يكون لجميع مساهمات الكود سياق.
إذا قمت بإنشاء منشور مدونة أو فيديو أو تعليمي أو مشروع Hackathon أو أي شيء آخر باستخدام QuickServ ، فيرجى فتح مشكلة أو رسالة في نموذج الاتصال الخاص بي حتى أتمكن من الارتباط به!
هناك بعض الطرق لدعم المشروع:
هذه الأشياء تحفزني على الاستمرار في مشاركة ما أقوم ببنائه ، ويوفرون التحقق من صحة عملي! كما أنها تساعدني في تحسين المشروع. شكرا مقدما!
إذا كنت تصر على إنفاق الأموال لإظهار دعمك ، فأنا أشجعك بدلاً من ذلك على التبرع السخي بواحدة من المنظمات التالية. من خلال الدعوة إلى حريات الإنترنت ، تساعدني منظمات مثل هذه على الشعور بالراحة في إطلاق العمل علنًا على الويب.
لن يكون هذا المشروع ممكنًا بدون مساعدة: