
Servicio web rápido y sin SETUP
Quickserv hace que la creación de aplicaciones web sea peligrosamente fácil, sin importar el lenguaje de programación que use.
Quickserv es un servidor web de una sola fil de un solo archivo sin dependencia, que está:
read y write Quickserv lleva la embriagadora diversión de Internet de la década de 1990 a la década de 2020. Está inspirado en la interfaz Common Gateway (CGI), pero es mucho más fácil de configurar y usar. A diferencia de CGI, funciona fuera de la caja sin buscar archivos de registro oscuros, sin aprender cómo funcionan los encabezados HTTP, sin jugar con bits de permiso, sin preocuparse por Cors, no se preguntan dónde poner sus scripts y sin luchar con las configuraciones de Apache mod_cgi .
A diferencia de CGI, no tiene que saber qué significa nada del párrafo anterior para usar Quickserv.
Es perfecto para:
Quickserv no debe usarse en Internet público. Solo debe usarse en redes privadas.
Usar Quickserv es tan fácil como descargar el programa, arrastrarlo a la carpeta de su proyecto y hacer doble clic para ejecutarse. Detecta automáticamente qué archivos ejecutar y cuáles servir directamente al usuario.
Descargar para Windows.
Haga una carpeta de proyecto y agregue archivos. Por ejemplo, si se instala Python, cree un archivo llamado test.py en la carpeta del proyecto que contiene:
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
Dado que test.py comienza con #!something , donde something test.py es el comando para ejecutar el archivo, QuickServ sabrá ejecutarlo. Si Quickserv no está ejecutando su archivo, asegúrese de agregar esto al principio.
En Windows, Quickserv también sabe ejecutar automáticamente archivos que terminan en .exe y .bat . Cualquier otro tipo de archivo debe comenzar con #!something si se debe ejecutar.
Mueva el archivo descargado de quickserv_windows_x64.exe a la carpeta del proyecto.

Haga doble clic en quickserv_windows_x64.exe en la carpeta del proyecto para iniciar Quickserv. Permita el acceso a través del defensor de Windows si se le solicita.


Vaya a http://127.0.0.1:42069 (o la dirección que se muestra por QuickServ) para conectarse a su aplicación web. En el ejemplo, para ejecutar test.py , vaya a http://127.0.0.1:42069/test.py.

Descargue la versión correcta para su computadora. Si es necesario, verifique qué tipo de procesador tiene su Mac. Tendrá que descomponer los archivos después de descargarlos.
Haga una carpeta de proyecto y agregue archivos. Por ejemplo, si se instala Python, cree un archivo llamado test.py en la carpeta del proyecto que contiene:
#!python
# Put your code here. For example:
import random
print ( random . randint ( 0 , 420 ))
Si está haciendo el archivo con TextEdit, deberá entrar en Format > Make Plain Text para guardar el archivo en el formato correcto.

Dado que test.py comienza con #!something , donde something test.py es el comando para ejecutar el archivo, QuickServ sabrá ejecutarlo. Si Quickserv no está ejecutando su archivo, asegúrese de agregar esto al principio.
En Mac, QuickServ también sabe ejecutar automáticamente archivos que se han compilado. Cualquier otro tipo de archivo debe comenzar con #!something si se debe ejecutar.
Mueva el archivo descargado de quickserv_macos_x64 o quickserv_macos_arm64 a la carpeta del proyecto.
Haga clic derecho en quickserv_macos_x64 o quickserv_macos_arm64 en la carpeta del proyecto y seleccione "Abrir". Luego, presione "Abrir" en el cuadro de diálogo de confirmación. Después de ejecutarlo de esta manera una vez, podrá iniciar Quickserv simplemente haciendo doble clic en el archivo.



Vaya a http://127.0.0.1:42069 (o la dirección que se muestra por QuickServ) para conectarse a su aplicación web. En el ejemplo, para ejecutar test.py , vaya a http://127.0.0.1:42069/test.py.

Es más fácil instalar y ejecutar a través de la línea de comando. Abra la terminal.
Ingrese los siguientes comandos. Se puede requerir una contraseña para los primeros comandos.
# 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 Vaya a http://127.0.0.1:42069 (o la dirección que se muestra por QuickServ) para conectarse a su aplicación web. Por ejemplo, para ejecutar test.py , vaya a http://127.0.0.1:42069/test.py.
Hacer clic para ejecutar ejecutables no tiene un comportamiento consistente en las distribuciones de Linux, por lo que es más fácil instalar y ejecutar a través de la línea de comando. Dependiendo de la arquitectura de su computadora, puede ser necesario cambiar el nombre de archivo al final de curl URL de solicitud HTTP a continuación.
Vea todas las opciones de descarga en la página de lanzamientos.
# 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 Vaya a http://127.0.0.1:42069 (o la dirección que se muestra por QuickServ) para conectarse a su aplicación web. Por ejemplo, para ejecutar test.py , vaya a http://127.0.0.1:42069/test.py.
Alternativamente, use las instrucciones a continuación para compilar desde la fuente.
Compilar e instalar desde la fuente usando el siguiente comando. Se requiere una versión de GO más de 1.16 debido a la dependencia de los sistemas de archivos integrados.
go install github.com/jstrieb/quickserv@latestLuego cree la carpeta de su proyecto, llénela y ejecute 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
quickservPara demostrar características clave de QuickServ, construiremos una aplicación web simple para realizar la adición. El código no seguirá las mejores prácticas, pero mostrará cuán poco se necesita para comenzar a construir con Quickserv.
Primero, creamos Crear una carpeta de proyecto y arrastramos el ejecutable de QuickServ a la carpeta, como en los pasos de inicio.
A continuación, dentro de la carpeta, guardamos el siguiente texto como index.html :
< form action =" /calculate " >
< input name =" first " type =" number " > + < input name =" second " type =" number " > = ???
< br >
< button > Calculate </ button >
</ form > Este código envía dos variables a la página /calculate . En el navegador, se ve así:

Luego, creamos una carpeta llamada calculate dentro de la carpeta del proyecto. Dentro de la carpeta calculate , guardamos el siguiente código como index.py . El nombre index.whatever Lo que le indique a QuickServ que ejecute este archivo cuando un usuario visita http://website/calculate en lugar de necesitar que visiten http://website/calculate/index.py .
Presta especial atención a los comentarios del código. Destacan una serie de características importantes de 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 )Ahora haga doble clic en Quickserv en la carpeta de su proyecto y pruébelo en su navegador. ¡Eso es todo!
Consulte los ejemplos vinculados en la siguiente sección para obtener más demostraciones de QuickServ. Lea más detalles en la sección Cómo funciona y en el código en sí. La sección avanzada tiene información adicional sobre el entorno que QuickServ se establece para ejecutables que ejecuta.
Todos los ejemplos se encuentran en la carpeta de examples , que es un submódulo GIT conectado al repositorio JSTRIEB/QuickServ-Examples. Vaya a ese repositorio para obtener más información sobre cómo ejecutar los ejemplos.
Algunos aspectos destacados:
| Resumen | Idioma | Windows | Impermeable | Linux |
|---|---|---|---|---|
| Youtube a gif | Caparazón | |||
| Crear filtros Bloom | do | |||
| Lista de películas sincronizadas | Mecanografiado | |||
| Intérprete brainfuck | ensamblaje X86-64 | |||
| Zoom de Mandelbrot | Caparazón | |||
| Tablero de criptomonedas | Ir | |||
| Herramientas PDF | Pitón | |||
| TypeSet Markdown como PDF | ML estándar |
Todo el código QuickServ vive en quickserv.go . Este archivo bien comentado tiene aproximadamente 700 líneas de largo, y debe tomar un programador experimentado sin familiaridad de Golang a lo sumo una hora para leer.
Quickserv tiene dos partes principales. El primero es un procedimiento de inicialización, ejecute exactamente una vez al inicio. La segunda es una función de controlador, llamada cada vez que un usuario realiza una solicitud HTTP al servidor.
Cuando QuickServ se inicia, verifica los indicadores de configuración de la línea de comandos, abre un archivo de registro si se pasa con --logfile (de lo contrario se registra en la salida estándar) y cambia los directorios si se pasa un directorio de trabajo con --dir . Tenga en cuenta que la ruta del archivo de registro es relativo al directorio de trabajo actual, no relativo al pasado con --dir .
A continuación, Quickserv escanea el directorio de trabajo para que los archivos se ejecuten. Imprime todos los archivos que se ejecutarán. Este comportamiento es útil para determinar si Quickserv reconoce un script como ejecutable. También imprime información útil para que el usuario, como la dirección web, visite para acceder al servidor, y en qué carpeta se ejecuta el servidor, así como cómo detenerlo.
Si alguna parte de la inicialización falla, se informa un error. En caso de un error fatal, Quickserv espera la entrada del usuario antes de dejar de fumar. De esta manera, un usuario que hace doble clic en el ejecutable (en lugar de iniciarlo desde la línea de comandos) no tiene una ventana y luego desaparece inmediatamente, parpadeando demasiado rápido para que se lea el error.
Los mensajes de error se escriben a propósito con la menor jerga técnica posible, aunque algunos son inevitables. Las causas probables de los errores también se incluyen en los mensajes de error, por lo que son más fáciles de identificar y arreglar para los usuarios.
Como el último paso en el procedimiento de inicialización, QuickServ inicia un servidor web con una función de controlador único para todas las solicitudes. El servidor escucha en el puerto predeterminado de 42069 , o en un puerto aleatorio si un usuario especificó el indicador de línea de comandos --random-port . Sería deseable un puerto aleatorio si el usuario tiene que mostrar un proyecto construido con QuickServ para alguien sin humor, por ejemplo.
Cuando un usuario visita una página web, QuickServ maneja la solicitud llamando a la función del controlador solitario.
Primero, esta función intenta abrir el archivo que solicitó el usuario. Si no puede encontrar o abrir el archivo, intenta servir una versión predeterminada del archivo. Por ejemplo, hay un favicon.ico incrustado y incrustado que recibe. Si no hay un archivo predeterminado que coincida con la ruta, permite que el servidor de archivos GO incorporado maneje el error y responda con un código de error 404.
Si el archivo que solicitó el usuario está presente, verifica si es un directorio. Si es un directorio, QuickServ busca un archivo llamado index.xxx donde xxx es cualquier extensión de archivo. Si se encuentra un archivo de índice, el índice se sirve (y posiblemente se ejecuta) como si fuera la página original solicitada. De lo contrario, el usuario debe haber solicitado un directorio sin un índice predeterminado, por lo que QuickServ responde con una lista de los otros archivos en el directorio.
Si el archivo que solicitó el usuario está presente y no un directorio ( es decir , es un archivo normal), Quickserv verifica si es ejecutable o no. Si es así, ejecuta el archivo que encontró. Si no, devuelve el contenido del archivo sin procesar al usuario. En ambos casos, Quickserv adivinará qué tipo de archivo (y, por lo tanto, qué mimetype ) usar para la respuesta.
La técnica para determinar si un archivo es ejecutable depende del sistema operativo de tiempo de ejecución. En Windows, cualquier archivo con una extensión .bat o .exe se considera ejecutable. En los sistemas no Windows, cualquier archivo con el conjunto de bits de permiso ejecutable se considera ejecutable. En todos los sistemas, un archivo es ejecutable si tiene un pseudo-shebang válido al principio. El shebang debe estar en la primera línea, ¡debe comenzar con #! , y debe ser un comando válido. Por ejemplo, ambos de los siguientes son aceptables, suponiendo que python3 esté instalado y en la PATH :
#!/usr/bin/python3#!python3 Para ejecutar un archivo, QuickServ ejecuta el archivo en sí (si es un .exe o tiene el conjunto de bits ejecutable), o pasa la ruta del archivo como el primer argumento al ejecutable que figura en su shebang. El cuerpo de solicitud se pasa al programa sobre entrada estándar, y todo lo impreso por el programa en salida estándar se usa como el cuerpo de respuesta. Los programas ejecutados no son responsables de escribir, ni capaces de escribir, los encabezados de respuesta HTTP.
Todas las variables de formulario HTTP analizadas (si el Content-Type es x-www-form-urlencoded ) también se pasan como argumentos de línea de comando cuando se ejecuta el programa. De esta manera, el usuario no necesita analizar las variables mismas.
Cualquiera que sea el programa ejecutado que imprima en el error estándar es registrado por QuickServ, lo que significa que se imprime en la ventana de la consola de forma predeterminada. Esto es útil para la depuración. Si el programa termina con un código de salida distinto de cero, QuickServ responde con un error de servidor interno de 500. De lo contrario, regresa con un 200.
Si la solicitud es una solicitud postal codificada con URL con datos de formulario, Quickserv URL decodifica todos los caracteres, excepto tres símbolos: % , & , y = . El usuario es responsable de sustituirlos. Tenga en cuenta que es importante siempre % de Decode URL en el programa que procesa los datos del formulario.
No ejecute QuickServ en Internet público. Solo ejecutarlo en redes privadas.
Quickserv no está diseñado para el uso de producción. No fue creado para ser rápido o seguro. El uso de Quickserv en la producción pone a sus usuarios y a usted mismo en riesgo, no lo haga.
Quickserv permite a las personas construir cosas peligrosamente inseguras. No desinfecta ninguna entrada o salida. Utiliza un proceso por solicitud y es susceptible a un ataque de denegación de servicio. Su modelo de seguridad supone que los usuarios web son confiables. Estas características hacen que la creación de prototipos sea más fácil, pero no son seguras en la Internet pública.
Para disuadir el uso de Quickserv en producción, se ejecuta en el puerto 42069 . Esperemos que eso haga que todos piensen dos veces antes de ingresarlo en un proxy inverso o una configuración de puerto hacia adelante. Para una demostración más profesional, la bandera de la línea de comandos --random-port usará un puerto aleatorio, determinado en tiempo de ejecución.
Quickserv es similar al antiguo protocolo CGI. Hay muchas razones bien articuladas y bien establecidas de que el CGI es malo en la producción, y todos se aplican a Quickserv en producción.
QuickServ tiene opciones avanzadas configuradas a través de indicadores de línea de comandos. Estos cambian cómo y dónde se ejecuta QuickServ, así como dónde guarda su salida.
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.
En la imitación de CGI, los encabezados HTTP se pasan al programa ejecutado como variables de entorno. Un encabezado llamado Header-Name se establecerá como la variable de entorno HTTP_HEADER_NAME .
También hay una variable REQUEST_TYPE que especifica si la solicitud fue GET , POST , etc.
Las solicitudes de HTTP con un cuerpo pasan el cuerpo al programa ejecutado en entrada estándar. En la mayoría de los casos, el cuerpo de solicitud se pasa textualmente. Este no es el caso de los formularios HTML.
Los datos de formulario HTML se pueden leer desde los argumentos de la línea de comandos, como en el tutorial, o analizarse desde la entrada estándar. Las variables toman el formulario
name=value&othername=othervalue
El simple ejemplo de adición del tutorial se puede reescribir para analizar los valores de formulario HTTP de la entrada estándar en lugar de desde los argumentos de la línea de comando.
#!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 )Este proyecto se desarrolla y mantiene activamente. Si no hay compromisos recientes, ¡significa que todo está funcionando sin problemas!
Abra un problema con cualquier error, sugerencia o pregunta. Esto incluye especialmente las discusiones sobre cómo hacer que los mensajes de error sea lo más claros posible y cómo hacer que la configuración predeterminada sea aplicable a la mayor cantidad de usuarios posible.
Las solicitudes de extracción sin discusión previa se ignorarán: no pierda el tiempo escribiendo código antes de confirmar que se fusionará. Como desarrollador ocupado y solitario, es más fácil responder cuando todas las contribuciones del código tienen contexto.
Si realiza una publicación de blog, video, tutorial, proyecto de hackathon o cualquier otra cosa que use Quickserv, ¡abra un problema o envíeme un mensaje en mi formulario de contacto para que pueda volver a vincularlo!
Hay algunas formas de apoyar el proyecto:
¡Estas cosas me motivan a seguir compartiendo lo que construyo, y proporcionan validación de que mi trabajo es apreciado! También me ayudan a mejorar el proyecto. ¡Gracias de antemano!
Si insiste en gastar dinero para mostrar su apoyo, le animo a que haga una donación generosa a una de las siguientes organizaciones. Al abogar por las libertades de Internet, organizaciones como estas me ayudan a sentirme cómodo publicando el trabajo públicamente en la web.
Este proyecto no sería posible sin la ayuda de: