
Layanan web cepat , tanpa setup
Quickserv membuat aplikasi web sangat mudah, tidak peduli bahasa pemrograman apa yang Anda gunakan.
Quickserv adalah server web file tunggal yang bebas ketergantungan, secara statis, yang:
read dan write Quickserv membawa kesenangan yang memabukkan dari internet 1990 -an ke tahun 2020 -an. Ini terinspirasi oleh Common Gateway Interface (CGI), tetapi jauh lebih mudah untuk diatur dan digunakan. Tidak seperti CGI, ia bekerja di luar kotak tanpa mencari file log yang tidak jelas, tidak belajar bagaimana header HTTP bekerja, tanpa mengutak -atik bit izin, tidak khawatir tentang COR, tidak heran di mana harus meletakkan skrip Anda, dan tidak ada kesulitan dengan konfigurasi Apache mod_cgi .
Berbeda dengan CGI, Anda tidak perlu tahu apa artinya dari paragraf sebelumnya untuk menggunakan Quickserv.
Itu sempurna untuk:
Quickserv tidak boleh digunakan di internet publik. Itu hanya boleh digunakan di jaringan pribadi.
Menggunakan quickserv semudah mengunduh program, menyeretnya ke folder proyek Anda, dan mengklik dua kali untuk dijalankan. Secara otomatis mendeteksi file mana yang akan dijalankan, dan mana yang berfungsi langsung kepada pengguna.
Unduh untuk Windows.
Buat folder proyek dan tambahkan file ke dalamnya. Misalnya, jika Python diinstal, buat file yang disebut test.py di folder proyek yang berisi:
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
Karena test.py dimulai dengan #!something , di mana something test.py adalah perintah untuk menjalankan file, QuickServ akan tahu untuk menjalankannya. Jika QuickServ tidak menjalankan file Anda, pastikan untuk menambahkan ini ke awal.
Di Windows, QuickServ juga tahu untuk secara otomatis menjalankan file yang berakhir di .exe dan .bat . Jenis file lainnya perlu dimulai dengan #!something jika harus dijalankan.
Pindahkan file quickserv_windows_x64.exe yang diunduh ke folder proyek.

Double Click quickserv_windows_x64.exe di folder proyek untuk memulai quickserv. Izinkan akses melalui Windows Defender jika diminta.


Buka http://127.0.0.1:42069 (atau alamat yang ditunjukkan oleh quickserv) untuk terhubung ke aplikasi web Anda. Dalam contoh, untuk menjalankan test.py , buka http://127.0.0.1:42069/test.py.

Unduh versi yang tepat untuk komputer Anda. Jika perlu, periksa jenis prosesor apa yang dimiliki Mac Anda. Anda harus membuka ritsleting file setelah Anda mengunduhnya.
Buat folder proyek dan tambahkan file ke dalamnya. Misalnya, jika Python diinstal, buat file yang disebut test.py di folder proyek yang berisi:
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
Jika Anda membuat file dengan TextEdit, Anda harus masuk ke Format > Make Plain Text untuk menyimpan file dalam format yang benar.

Karena test.py dimulai dengan #!something , di mana something test.py adalah perintah untuk menjalankan file, QuickServ akan tahu untuk menjalankannya. Jika QuickServ tidak menjalankan file Anda, pastikan untuk menambahkan ini ke awal.
Di Mac, QuickServ juga tahu untuk secara otomatis menjalankan file yang telah dikompilasi. Jenis file lainnya perlu dimulai dengan #!something jika harus dijalankan.
Pindahkan file quickserv_macos_x64 yang diunduh atau file quickserv_macos_arm64 ke folder proyek.
Klik kanan quickserv_macos_x64 atau quickserv_macos_arm64 di folder proyek dan pilih "Buka." Kemudian, tekan "Buka" di kotak dialog Konfirmasi. Setelah menjalankannya dengan cara ini sekali, Anda akan dapat memulai Quickserv dengan hanya mengklik dua kali file.



Buka http://127.0.0.1:42069 (atau alamat yang ditunjukkan oleh quickserv) untuk terhubung ke aplikasi web Anda. Dalam contoh, untuk menjalankan test.py , buka http://127.0.0.1:42069/test.py.

Termudah untuk menginstal dan menjalankan melalui baris perintah. Buka terminal.
Masukkan perintah berikut. Kata sandi mungkin diperlukan untuk perintah pertama.
# 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 Buka http://127.0.0.1:42069 (atau alamat yang ditunjukkan oleh quickserv) untuk terhubung ke aplikasi web Anda. Misalnya, untuk menjalankan test.py , buka http://127.0.0.1:42069/test.py.
Mengklik untuk menjalankan executables tidak memiliki perilaku yang konsisten di seluruh distro Linux, jadi paling mudah untuk menginstal dan dijalankan melalui baris perintah. Bergantung pada arsitektur komputer Anda, mungkin perlu mengubah nama file di akhir URL permintaan HTTP curl di bawah ini.
Lihat semua opsi unduhan di halaman rilis.
# 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 Buka http://127.0.0.1:42069 (atau alamat yang ditunjukkan oleh quickserv) untuk terhubung ke aplikasi web Anda. Misalnya, untuk menjalankan test.py , buka http://127.0.0.1:42069/test.py.
Atau, gunakan instruksi di bawah ini untuk menyusun dari sumber.
Kompilasi dan instal dari sumber menggunakan perintah berikut. Versi Go lebih besar dari 1,16 diperlukan karena ketergantungan pada sistem file tertanam.
go install github.com/jstrieb/quickserv@latestKemudian buat folder proyek Anda, isi, dan jalankan 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
quickservUntuk mendemonstrasikan fitur utama QuickServ, kami akan membangun aplikasi web sederhana untuk melakukan penambahan. Kode ini tidak akan mengikuti praktik terbaik, tetapi itu akan menunjukkan betapa sedikit yang diperlukan untuk mulai membangun dengan Quickserv.
Pertama, kami membuat membuat folder proyek dan menyeret Executable QuickServ ke folder, seperti pada langkah -langkah awal.
Selanjutnya, di dalam folder, kami menyimpan teks berikut sebagai index.html :
< form action =" /calculate " >
< input name =" first " type =" number " > + < input name =" second " type =" number " > = ???
< br >
< button > Calculate </ button >
</ form > Kode ini mengirimkan dua variabel ke halaman /calculate . Di browser, sepertinya ini:

Kemudian, kami membuat folder yang disebut calculate di dalam folder Proyek. Di dalam folder calculate , kami menyimpan kode berikut sebagai index.py . index.whatever Nama. Apa pun yang memberitahu QuickServ untuk menjalankan file ini ketika pengguna mengunjungi http://website/calculate alih -alih membutuhkannya untuk mengunjungi http://website/calculate/index.py .
Berikan perhatian khusus pada komentar kode. Mereka menyoroti sejumlah fitur quickserv penting.
#!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 )Sekarang klik dua kali QuickServ di folder proyek Anda dan coba di browser Anda. Itu saja!
Lihat contoh yang ditautkan di bagian selanjutnya untuk demonstrasi quickserv lebih banyak. Baca lebih detail di bagian How It Works, dan dalam kode itu sendiri. Bagian lanjutan memiliki informasi tambahan tentang lingkungan yang diatur QuickServ untuk menjalankan yang dapat dijalankannya.
Semua contoh terletak di folder examples , yang merupakan submodule git yang terhubung ke repo JStrieb/quickserv-ecamples. Buka repo itu untuk informasi lebih lanjut tentang cara menjalankan contoh.
Beberapa highlight:
| Ringkasan | Bahasa | Windows | Mac | Linux |
|---|---|---|---|---|
| YouTube ke GIF | Kerang | |||
| Buat filter mekar | C | |||
| Daftar film yang disinkronkan | Naskah | |||
| Interpreter Brainfuck | x86-64 Majelis | |||
| Zoom Mandelbrot | Kerang | |||
| Dasbor cryptocurrency | Pergi | |||
| Alat PDF | Python | |||
| Markdown teseet sebagai PDF | ML standar |
Semua kode quickserv tinggal di quickserv.go . File yang dikomentasikan dengan baik ini panjangnya sekitar 700 baris, dan harus mengambil programmer yang berpengalaman tanpa keakraban Golang paling banyak satu jam untuk dibaca.
Quickserv memiliki dua bagian utama. Yang pertama adalah prosedur inisialisasi, berjalan tepat sekali saat startup. Yang kedua adalah fungsi penangan, dipanggil setiap kali pengguna membuat permintaan HTTP ke server.
Ketika QuickServ dimulai, ia memeriksa bendera konfigurasi baris perintah, membuka file log jika dilewatkan dengan --logfile (jika tidak, masuk ke output standar), dan mengubah direktori jika direktori yang berfungsi dilewatkan dengan --dir . Perhatikan bahwa jalur file log relatif terhadap direktori kerja saat ini, tidak relatif terhadap yang dilewatkan dengan --dir .
Selanjutnya, QuickServ memindai direktori kerja untuk dijalankan file. Ini mencetak semua file yang akan dieksekusi. Perilaku ini berguna untuk menentukan apakah QuickServ mengenali skrip sebagai dapat dieksekusi. Ini juga mencetak informasi yang bermanfaat untuk pengguna seperti alamat web untuk mengunjungi untuk mengakses server, dan folder apa yang dijalankan server, serta cara menghentikannya.
Jika ada bagian dari inisialisasi yang gagal, kesalahan dilaporkan. Jika terjadi kesalahan fatal, QuickServ menunggu input pengguna sebelum berhenti. Dengan cara ini, pengguna yang mengklik dua kali yang dapat dieksekusi (sebagai lawan memulainya dari baris perintah) tidak memiliki jendela muncul dan kemudian segera menghilang, berkedip terlalu cepat untuk kesalahan dibaca.
Pesan kesalahan dengan sengaja ditulis dengan jargon teknis sesedikit mungkin, meskipun beberapa tidak dapat dihindari. Kemungkinan penyebab kesalahan juga termasuk dalam pesan kesalahan, sehingga lebih mudah bagi pengguna untuk mengidentifikasi dan memperbaiki.
Sebagai langkah terakhir dalam prosedur inisialisasi, QuickServ memulai server web dengan fungsi penangan tunggal untuk semua permintaan. Server mendengarkan pada port default 42069 , atau pada port acak jika pengguna menentukan flag baris --random-port . Port acak akan diinginkan jika pengguna harus menunjukkan proyek yang dibangun dengan quickserv kepada seseorang tanpa humor, misalnya.
Ketika pengguna mengunjungi halaman web, QuickServ menangani permintaan dengan memanggil fungsi handler tunggal.
Pertama, fungsi ini mencoba membuka file yang diminta pengguna. Jika tidak dapat menemukan atau membuka file, ia mencoba untuk melayani versi default file. Misalnya, ada favicon.ico yang tertanam dan default yang disajikan. Jika tidak ada file default yang cocok dengan path, itu memungkinkan file server go bawaan menangani kesalahan dan merespons dengan kode kesalahan 404.
Jika file yang diminta pengguna hadir, itu memeriksa apakah itu direktori. Jika itu adalah direktori, QuickServ mencari di dalam untuk file bernama index.xxx di mana xxx adalah ekstensi file apa pun. Jika file indeks ditemukan, indeks dilayani (dan mungkin dieksekusi) seolah -olah itu adalah halaman asli yang diminta. Jika tidak, pengguna harus meminta direktori tanpa indeks default, jadi QuickServ merespons dengan daftar file lain di direktori.
Jika file yang diminta pengguna hadir dan bukan direktori ( yaitu , itu adalah file biasa), QuickServ memeriksa apakah dapat dieksekusi atau tidak. Jika demikian, itu mengeksekusi file yang ditemukannya. Jika tidak, ia mengembalikan konten file mentah ke pengguna. Dalam kedua kasus, QuickServ akan menebak filetype apa (dan karena itu mimetype ) yang akan digunakan untuk respons.
Teknik untuk menentukan apakah suatu file dapat dieksekusi tergantung pada sistem operasi runtime. Di Windows, file apa pun dengan ekstensi .bat atau .exe dianggap dapat dieksekusi. Pada sistem non-Windows, file apa pun dengan set bit izin yang dapat dieksekusi dianggap dapat dieksekusi. Pada semua sistem, file dapat dieksekusi jika memiliki pseudo-shebang yang valid di awal. Shebang harus berada di baris pertama, harus dimulai dengan #! , dan harus menjadi perintah yang valid. Misalnya, kedua berikut ini dapat diterima, dengan asumsi python3 diinstal dan di PATH :
#!/usr/bin/python3#!python3 Untuk menjalankan file, QuickServ menjalankan file itu sendiri (jika itu adalah .exe atau memiliki set bit yang dapat dieksekusi), atau melewati jalur file sebagai argumen pertama ke yang dapat dieksekusi yang terdaftar di shebang -nya. Badan permintaan diteruskan ke program pada input standar, dan semua yang dicetak oleh program pada output standar digunakan sebagai badan respons. Program yang dieksekusi tidak bertanggung jawab untuk menulis - tidak dapat menulis - header respons HTTP.
Semua variabel formulir HTTP yang diuraikan (jika Content-Type adalah x-www-form-urlencoded ) juga disahkan sebagai argumen baris perintah ketika program dieksekusi. Dengan cara ini, pengguna tidak perlu mengurai variabel itu sendiri.
Apa pun program yang dieksekusi dicetak pada kesalahan standar dicatat oleh quickserv, yang berarti dicetak di jendela konsol secara default. Ini berguna untuk debugging. Jika program berakhir dengan kode keluar nol nol, QuickServ merespons dengan kesalahan server internal 500. Kalau tidak, ia kembali dengan 200.
Jika permintaan tersebut adalah permintaan pos yang dikodekan URL dengan data formulir, quickserv-mendekode semua karakter kecuali untuk tiga simbol: % , & , dan = . Pengguna bertanggung jawab untuk mengganti ini. Perhatikan bahwa penting untuk selalu melakukan url-decode % terakhir dalam program yang memproses data formulir.
Jangan jalankan quickserv di internet publik. Jalankan hanya di jaringan pribadi.
Quickserv tidak dirancang untuk penggunaan produksi. Itu tidak dibuat untuk menjadi cepat atau aman. Menggunakan quickserv dalam produksi menempatkan pengguna Anda dan diri Anda dalam risiko, tolong jangan lakukan itu.
Quickserv memungkinkan orang membangun hal -hal yang tidak aman. Itu tidak membersihkan input atau output apa pun. Ini menggunakan satu proses per permintaan, dan rentan terhadap penyangkalan serangan layanan. Model keamanannya menganggap pengguna web dapat dipercaya. Karakteristik ini membuat prototipe lebih mudah, tetapi tidak aman di internet publik.
Untuk mencegah menggunakan quickserv dalam produksi, itu berjalan di port 42069 . Mudah -mudahan itu membuat semua orang berpikir dua kali sebelum memasukkannya ke proxy terbalik atau konfigurasi port ke depan. Untuk demo yang lebih profesional, bendera baris perintah --random-port sebaliknya akan menggunakan port acak, ditentukan saat runtime.
Quickserv mirip dengan protokol CGI kuno. Ada banyak alasan yang diartikulasikan dengan baik dan mapan bahwa CGI buruk dalam produksi, dan semuanya berlaku untuk quickserv dalam produksi.
QuickServ memiliki opsi lanjutan yang dikonfigurasi melalui bendera baris perintah. Ini mengubah bagaimana dan di mana quickserv berjalan, serta di mana ia menyimpan outputnya.
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.
Dalam meniru CGI, header HTTP diteruskan ke program yang dieksekusi sebagai variabel lingkungan. Header yang disebut Header-Name akan ditetapkan sebagai variabel lingkungan HTTP_HEADER_NAME .
Ada juga variabel REQUEST_TYPE yang menentukan apakah permintaan itu GET , POST , dll .
Permintaan HTTP dengan tubuh meneruskan tubuh ke program yang dieksekusi pada input standar. Dalam kebanyakan kasus, badan permintaan disahkan secara kata demi kata. Ini bukan kasus untuk formulir HTML.
Data formulir HTML dapat dibaca dari argumen baris perintah, seperti pada tutorial, atau diuraikan dari input standar. Variabel mengambil formulir
name=value&othername=othervalue
Contoh penambahan sederhana dari tutorial dapat ditulis ulang untuk menguraikan nilai formulir HTTP dari input standar alih -alih dari argumen baris perintah.
#!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 )Proyek ini dikembangkan dan dipelihara secara aktif. Jika tidak ada komit baru, itu berarti semuanya berjalan dengan lancar!
Harap buka masalah dengan bug, saran, atau pertanyaan apa pun. Ini terutama mencakup diskusi tentang cara membuat pesan kesalahan sejelas mungkin, dan cara membuat pengaturan default berlaku untuk sebanyak mungkin pengguna.
Permintaan tarik tanpa diskusi sebelumnya akan diabaikan - jangan buang waktu menulis kode sebelum mengkonfirmasi bahwa itu akan digabungkan. Sebagai pengembang yang sibuk dan sendirian, lebih mudah untuk menjadi responsif ketika semua kontribusi kode memiliki konteks.
Jika Anda membuat posting blog, video, tutorial, proyek hackathon, atau apa pun menggunakan Quickserv, silakan buka masalah atau pesan saya di formulir kontak saya sehingga saya dapat menautkan kembali ke sana!
Ada beberapa cara untuk mendukung proyek:
Hal -hal ini memotivasi saya untuk terus berbagi apa yang saya bangun, dan mereka memberikan validasi bahwa pekerjaan saya dihargai! Mereka juga membantu saya meningkatkan proyek. Terima kasih sebelumnya!
Jika Anda bersikeras menghabiskan uang untuk menunjukkan dukungan Anda, saya mendorong Anda untuk memberikan sumbangan yang murah hati ke salah satu organisasi berikut. Dengan mengadvokasi kebebasan internet, organisasi seperti ini membantu saya merasa nyaman merilis pekerjaan secara publik di web.
Proyek ini tidak akan mungkin terjadi tanpa bantuan: