
Быстрый , без режима
QuickServ делает создание веб -приложений опасно простыми, независимо от того, какой язык программирования вы используете.
QuickServ-это веб-сервер, связанный без зависимости, статически связанный с одним файлом, который:
read и write QuickServ приносит волну в Интернете 1990 -х годов до 2020 -х годов. Он вдохновлен общим интерфейсом шлюза (CGI), но его гораздо проще настроить и использовать. В отличие от CGI, он работает из коробки без поиска неясных файлов журнала, без изучения того, как работают заголовки HTTP, без битов с разрешением, без беспокойства о CORS, неудивительно, куда размещать свои сценарии, и не бороться с конфигурациями 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. Разрешить доступ через Defender Windows, если это будет предложено.


Перейдите по адресу 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 в папке проекта и выберите «Открыть». Затем нажмите «Открыть» в диалоговом окне подтверждения. После того, как один раз запустил его таким образом, вы сможете запустить 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.
Нажатие, чтобы запустить исполняемые файлы, не имеет последовательного поведения в дистрибуциях Linux, поэтому легко установить и запускать через командную строку. В зависимости от архитектуры вашего компьютера, может потребоваться изменить имя файла в конце 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 .
Обратите особое внимание на комментарии кода. Они выделяют ряд важных функций щупывания.
#!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. Прочитайте больше подробностей в разделе «Как это работает» и в самом коде. В расширенном разделе есть дополнительная информация о среде QuickServ, установленной для выполнения исполняемых файлов.
Все примеры расположены в папке examples , которая представляет собой подмодуль GIT, подключенный к репо jstrieb/QuickServ-Examples. Перейдите в это репо, чтобы получить дополнительную информацию о том, как запустить примеры.
Некоторые основные моменты:
| Краткое содержание | Язык | Окна | Маки | Linux |
|---|---|---|---|---|
| YouTube для GIF | Оболочка | |||
| Создайте фильтры Bloom | В | |||
| Синхронизированный список фильмов | Машинопись | |||
| Brainfuck Интерпретатор | x86-64 сборка | |||
| Мандельброт увеличил | Оболочка | |||
| Криптовалюта приборная панель | Идти | |||
| PDF -инструменты | Питон | |||
| Набора маркировки как PDF | Стандартный Ml |
Весь код QuickServ живет в quickserv.go . Этот хорошо смягченный файл длится около 700 строк и должен взять опытного программиста без знакомства с Голангом не более часа для чтения.
QuickServ имеет две основные части. Первая - это процедура инициализации, запустите ровно один раз при запуске. Второе - это функция обработчика, называемая каждый раз, когда пользователь делает HTTP -запрос на сервер.
Когда QuickServ запускается, он проверяет на флаги конфигурации командной строки, открывает файл журнала, если один проходит с помощью --logfile (в противном случае он входит в систему на стандартный вывод) и изменяет каталоги, если рабочий каталог передается с помощью --dir . Обратите внимание, что путь файла журнала относительно текущего рабочего каталога, а не по сравнению с тем, что прошел с --dir .
Затем QuickServ сканирует рабочий каталог для запуска файлов. Он печатает все файлы, которые будут выполнены. Такое поведение полезно для определения того, распознает ли QuickServ сценарий как исполняемый файл. Он также печатает полезную информацию для пользователя, такой как веб -адрес для посещения, чтобы получить доступ к серверу, и в какой папке работает сервер, а также как его остановить.
Если какая -либо часть инициализации не выполняется, сообщается об ошибке. В случае смертельной ошибки QuickServ ожидает ввода пользователя перед уходом. Таким образом, пользователь, который дважды щелкает исполняемым файлом (в отличие от запуска его из командной строки), не появляется окно, а затем сразу же исчезает, слишком быстро мигая, чтобы прочитать ошибку.
Сообщения об ошибках целенаправленно записываются с максимально небольшим техническим жаргоном, хотя некоторые неизбежны. Вероятные причины ошибок также включены в сообщения об ошибках, так что им легче идентифицировать и исправить их.
В качестве последнего шага в процедуре инициализации QuickServ запускает веб -сервер с одной функцией обработчика для всех запросов. Сервер прослушивает порт по умолчанию 42069 или на случайном порте, если пользователь указал флаг командной строки-- --random-port . Случайный порт был бы желательным, если бы пользователь должен показать проект, созданный, например, с QuickServ для кого -то без юмора.
Когда пользователь посещает веб -страницу, QuickServ обрабатывает запрос, вызывая функцию одинокого обработчика.
Во -первых, эта функция пытается открыть файл, который запросил пользователь. Если он не может найти или открыть файл, он пытается обслуживать версию файла по умолчанию. Например, есть встроенный, по умолчанию favicon.ico , который обслуживается. Если нет файла по умолчанию, соответствующего пути, он позволяет встроенным файловому серверу GO обрабатывать ошибку и отвечать кодом ошибки 404.
Если присутствует файл, который запросил пользователь, он проверяет, является ли это каталогом. Если это каталог, QuickServ смотрит внутрь для файла с именем index.xxx , где xxx является расширением файла. Если найден файл индекса, индекс обслуживается (и, возможно, выполняется), как если бы это была запрошенная исходная страница. В противном случае пользователь должен был запросить каталог без индекса по умолчанию, поэтому QuickServ отвечает списком других файлов в каталоге.
Если присутствует файл, который запросил пользователь, а не каталог ( т.е. это обычный файл), QuickServ проверяет, является ли он исполняемым или нет. Если это так, он выполняет найден файл. Если нет, он возвращает содержимое необработанного файла пользователю. В обоих случаях QuickServ угадает, какой филетип (и, следовательно, какой mimetype ) использовать для ответа.
Техника для определения того, является ли файл исполняемый файл, зависит от операционной системы времени выполнения. В Windows любой файл с расширением .bat или .exe считается исполняемым файлом. В системах, не являющихся Windows, любой файл с набором битовых разрешений считается исполняемым файлом. Во всех системах файл исполняется, если вначале он имеет допустимый псевдо-сэбанг. Шебанг должен быть на самой первой строке, должен начать с #! и должно быть действительной командой. Например, оба из перечисленных являются приемлемыми, предполагая, что python3 установлен и на PATH :
#!/usr/bin/python3#!python3 Чтобы выполнить файл, QuickServ либо запускает сам файл (если он является .exe , либо имеет исполняемый набор битов), либо он проходит путь файла в качестве первого аргумента исполняемому файлу, указанному в его Shebang. Тело запроса передается в программу по стандартному вводу, и все, что напечатано программой на стандартном выходе, используется в качестве корпуса ответа. Выполненные программы не несут не ответственны за написание - не способные писать - HTTP -заголовки ответов.
Все проанализированные переменные HTTP-формы (если Content-Type x-www-form-urlencoded ) также передаются в качестве аргументов командной строки при выполнении программы. Таким образом, пользователю не нужно проанализировать сами переменные.
Независимо от того, что выполняемая программа печатает по стандартной ошибке, зарегистрирована QuickServ, что означает, что она печатается в окне консоли по умолчанию. Это удобно для отладки. Если программа заканчивается ненулевым выходом кода, QuickServ реагирует с ошибкой внутреннего сервера 500. В противном случае он возвращается с 200.
Если запрос представляет собой запрос, кодируемый URL, с данными формы, у Url-Decods QuickServ все символы, кроме трех символов: % , & и = . Пользователь несет ответственность за замену их. Обратите внимание, что важно всегда URL-Decode % в программе, которая обрабатывает данные формы.
Не запускайте QuickServ в общедоступном интернете. Запустите его только в частных сетях.
QuickServ не предназначен для производственного использования. Это не было создано, чтобы быть быстрым или безопасным. Использование QuickServ в производстве подвергает риска ваших пользователей и вас, пожалуйста, не делайте этого.
QuickServ позволяет людям строить опасно небезопасные вещи. Он не дезинфицирует какие -либо входы или выходы. Он использует один процесс по запросу и подвержен атаке отказа. Его модель безопасности предполагает, что веб -пользователи заслуживают доверия. Эти характеристики облегчают прототипирование, но не безопасны в общедоступном Интернете.
Чтобы удержать использование QuickServ в производстве, он работает на порту 42069 . Надеемся, что это заставит всех дважды думать, прежде чем ввести его в обратный прокси или конфигурация порта. Для более профессиональной демонстрации флаг командной строки --random-port вместо этого будет использовать случайный порт, определенный во время выполнения.
Свитсервию похож на древний протокол 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 )Этот проект активно развивается и поддерживается. Если недавних коммитов нет, это означает, что все работает гладко!
Пожалуйста, откройте проблему с любыми ошибками, предложениями или вопросами. Это особенно включает в себя дискуссии о том, как сделать сообщения об ошибках как можно более четкими, и как сделать настройки по умолчанию применимыми к как можно большему количеству пользователей.
Запросы на привлечение без предварительного обсуждения будут проигнорированы - не тратьте время на написание кода, прежде чем подтвердить, что он будет объединен.
Если вы сделаете сообщение в блоге, видео, учебник, проект хакатона или что -нибудь еще, используя QuickServ, откройте проблему или сообщите мне в моей контактной форме, чтобы я мог ссылаться на него!
Есть несколько способов поддержать проект:
Эти вещи мотивируют меня продолжать делиться тем, что я строю, и они обеспечивают подтверждение того, что моя работа ценится! Они также помогают мне улучшить проект. Заранее спасибо!
Если вы настаиваете на том, чтобы потратить деньги, чтобы показать свою поддержку, я призываю вас вместо этого сделать щедрое пожертвование одной из следующих организаций. Выступая за свободы интернета, подобные организации помогают мне чувствовать себя комфортно, публично выпустив работу в Интернете.
Этот проект был бы невозможным без помощи: