
快速,无设置的网络服务
QuickServ无论您使用哪种编程语言,都可以使创建Web应用程序变得危险地容易。
QuickServ是一款无依赖性,静态链接的单文件Web服务器:
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。如果提示,允许通过Windows Defender访问。


请访问http://127.0.0.1:42069(或QuickServ显示的地址)以连接到您的Web应用程序。在示例中,要运行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显示的地址)以连接到您的Web应用程序。在示例中,要运行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显示的地址)以连接到您的Web应用程序。例如,要运行test.py ,请访问http://127.0.0.1:42069/test.py。
单击以运行可执行文件在Linux发行版中没有一致的行为,因此最容易通过命令行安装和运行。根据计算机的体系结构,可能有必要在下面的curl HTTP请求URL结束时更改文件名。
请参阅“发行”页面上的所有下载选项。
# 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显示的地址)以连接到您的Web应用程序。例如,要运行test.py ,请访问http://127.0.0.1:42069/test.py。
或者,使用下面的说明从源中进行编译。
使用以下命令从源进行编译和安装。由于对嵌入式文件系统的依赖性,因此需要大于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的关键功能,我们将构建一个简单的Web应用程序来执行添加。该代码不会遵循最佳实践,但是它将显示使用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 ,当用户访问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文件夹中,该文件夹是连接到Jstrieb/QuickServ-Examples repo的GIT子模块。转到该存储库,以获取有关如何运行示例的更多信息。
一些亮点:
| 概括 | 语言 | 视窗 | 苹果 | Linux |
|---|---|---|---|---|
| YouTube到GIF | 壳 | |||
| 创建Bloom过滤器 | c | |||
| 同步电影列表 | 打字稿 | |||
| Brainfuck口译员 | X86-64组件 | |||
| Mandelbrot Zoom | 壳 | |||
| 加密货币仪表板 | 去 | |||
| PDF工具 | Python | |||
| 排版宣传为PDF | 标准ML |
所有的QuickServ代码都生活在quickserv.go中。这个被充分评价的文件长约700行,应该以一个经验丰富的程序员在最多一个小时的阅读中没有golang熟悉度。
QuickServ有两个主要部分。第一个是一个初始化过程,在启动时精确地运行一次。第二个是处理程序功能,每次用户向服务器提出HTTP请求时都称为。
当QuickServ启动时,它会检查命令行配置标志,如果使用一个--logfile传递,则打开日志文件(否则它将登录到标准输出),如果使用工作目录(使用--dir ),则更改目录。请注意,日志文件路径相对于当前工作目录,而不是与--dir一起传递的目录。
接下来,QuickServ扫描工作目录以使文件运行。它打印将执行的所有文件。此行为对于确定QuickServ是否将脚本识别为可执行文件很有用。它还为用户打印有用的信息,例如访问服务器的网址,以及服务器正在运行的哪个文件夹以及如何停止它。
如果初始化的任何部分失败,则报告错误。如果发生致命错误,QuickServ在退出之前等待用户输入。这样,双击可执行文件(而不是从命令行启动)的用户不会出现窗口,然后立即消失,闪烁得太快,无法读取错误。
错误消息是有目的地编写的,尽管不可避免地,但尽可能少的技术术语。错误消息中可能还包括错误的原因,因此它们更容易使用户识别和修复。
作为初始化过程的最后一步,QuickServ启动了一个具有单个处理程序功能的Web服务器。如果用户指定了--random-port命令行标志,则该服务器在42069的默认端口或随机端口上听。例如,如果用户必须向某人提供无幽默的人,则希望随机端口是可取的。
当用户访问网页时,QuickServ通过调用孤独处理程序功能来处理请求。
首先,此功能试图打开用户请求的文件。如果找不到或打开文件,它将尝试提供文件的默认版本。例如,有一个嵌入式默认的favicon.ico可以使用。如果没有与路径相匹配的默认文件,则可以让内置的GO文件服务器处理错误并使用404错误代码响应。
如果使用用户请求的文件,则检查是否是目录。如果是目录,则QuickServ在其中查找一个名为index.xxx的文件,其中xxx是任何文件扩展名。如果找到了索引文件,则将索引提供(并可能执行),就好像是所请求的原始页面一样。否则,用户必须已经请求一个没有默认索引的目录,因此QuickServ在目录中的其他文件列出了响应。
如果用户请求的文件存在,而不是目录(即,它是常规文件),则QuickServ检查是否可执行。如果是这样,它将执行找到的文件。如果没有,它将原始文件内容返回给用户。在这两种情况下,QuickServ将猜测要用于响应的Filetype(以及哪种mimetype )。
确定文件是否可执行的技术取决于运行时操作系统。在Windows上,任何带有.bat或.exe扩展名的文件都可以执行。在非Windows系统上,任何具有可执行权限的文件设置的文件都被视为可执行文件。在所有系统上,如果文件在开始时具有有效的伪shebang,则可以执行。 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对所有字符进行编码,除了三个符号: % , & and = 。用户负责替换这些。请注意,在处理表单数据的程序中,始终始终url-depepode %持续。
不要在公共互联网上运行QuickServ。仅在专用网络上运行。
QuickServ并非设计用于生产使用。它不是为了快速或安全而创建的。在生产中使用QuickServ会使您的用户和您自己处于危险之中,请不要这样做。
QuickServ使人们可以建立危险的不安全事物。它不会消毒任何输入或输出。它每个请求使用一个过程,并且容易受到拒绝服务攻击。它的安全模型假定Web用户值得信赖。这些特征使原型制作更加容易,但在公共互联网上并不安全。
为了在生产中使用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
可以从标准输入而不是从命令行参数中重写教程中的简单添加示例。
#!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制作博客文章,视频,教程,黑客马拉松项目或其他任何内容,请在我的联系表上打开问题或给我发消息,以便我可以链接回它!
有几种支持该项目的方法:
这些事情促使我继续分享我的构建,并提供了对我的工作表示赞赏的验证!他们还可以帮助我改善该项目。提前致谢!
如果您坚持花钱来表示支持,我鼓励您向以下一个组织之一慷慨捐赠。通过倡导互联网自由,这样的组织可以帮助我在网络上公开发布工作。
没有: