
快速,無設置的網絡服務
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製作博客文章,視頻,教程,黑客馬拉松項目或其他任何內容,請在我的聯繫表上打開問題或給我發消息,以便我可以鏈接回它!
有幾種支持該項目的方法:
這些事情促使我繼續分享我的構建,並提供了對我的工作表示讚賞的驗證!他們還可以幫助我改善該項目。提前致謝!
如果您堅持花錢來表示支持,我鼓勵您向以下一個組織之一慷慨捐贈。通過倡導互聯網自由,這樣的組織可以幫助我在網絡上公開發布工作。
沒有: