Der Sinatra-ähnliche Web-Framework für Nim. Jester bietet eine DSL zum schnellen Erstellen von Webanwendungen in NIM.
# example.nim
import htmlgen
import jester
routes:
get " / " :
resp h1 ( " Hello world " )Kompilieren und rennen mit:
cd tests/example
nim c -r example.nim
Blick auf: localhost: 5000
Stellen Sie vor der Bereitstellung zur Produktion sicher, dass Sie Ihre Anwendung hinter einem Reverse -Proxy ausführen. Diese Bibliothek ist noch nicht mit HTTP -Sicherheitsausbeutungen gehärtet, sodass die darin enthaltenen Bewerbungen nicht dem öffentlichen Internet ausgesetzt werden sollten.
routes:
get " / " :
# do something here. Alle Routen müssen sich in einem routes befinden.
Routen werden in der Bestellung ausgeführt, dass sie deklariert werden. Seien Sie also vorsichtig, wenn Sie anhalten.
Der Routenpfad kann ein spezielles Muster oder nur eine statische Saite enthalten. Besondere Muster sind fast identisch mit Sinatras, der einzige wirkliche Unterschied ist die Verwendung von @ anstelle der :
get " /hello/@name " :
# This matches "/hello/fred" and "/hello/bob".
# In the route ``@"name"`` will be either "fred" or "bob".
# This can of course match any value which does not contain '/'.
resp " Hello " & @ " name "Die Muster im Narren sind derzeit etwas begrenzter, es gibt keine Wildcard -Muster.
Sie können das "?" Zeichen für optionale Pfadteile.
get " /hello/@name? " :
# This will match what the previous code example matches but will also match
# "/hello/".
if @ " name " == " " :
resp " No name received :( "
else :
resp " Hello " & @ " name "In diesem Fall möchten Sie vielleicht auch die führende '/' optional machen. Dies können Sie dies tun, indem Sie das Muster in "/Hallo/?@Name?" Ändern. Dies ist nützlich, da Jester nicht "/Hallo" übereinstimmt, wenn der führende '/' nicht optional gemacht wird.
Regex kann auch als Routenmuster verwendet werden. Die Unterpassungen werden in request.matches platziert. Zum Beispiel:
get re " ^ /([0-9]{2}) .html$ " :
resp request.matches[ 0 ] Dies entspricht den URLs des Formulars /15.html . In diesem Fall request.matches[0] beträgt 15 .
Jester unterstützt die Bedingungen, sind jedoch auf eine einfache cond beschränkt.
routes:
get " /@name " :
cond @ " name " == " daniel "
# ``cond`` will pass execution to the next matching route if @"name" is not
# "daniel".
resp " Correct, my name is daniel. "
get " /@name " :
# This will be the next route that is matched.
resp " No, that's not my name. " Routenkörper haben alle ein implizites request . Dieses Objekt ist in Jester dokumentiert. Nim und die Dokumentation kann durch Ausführung nim doc jester.nim generiert werden.
Die Rückgabe einer Antwort von einer Route sollte unter Verwendung einer der folgenden Funktionen erfolgen:
resp .body , headers und/oder status und Rufen return .redirectattachmentEs könnte mehr geben. Schauen Sie sich die Dokumentation von Jester.nim an, um weitere Informationen zu erhalten.
Es ist möglich, das routes -Makro nicht zu verwenden und das Routing selbst zu machen.
Sie können dies tun, indem Sie Ihre eigene match -Prozedur schreiben. Schauen Sie sich Beispiel2 an, um ein Beispiel dazu zu erhalten.
Standardmäßig sucht Jester nach statischen Dateien in ./public . Dies kann mithilfe der setStaticDir -Funktion überschrieben werden. Dateien werden so serviert:
./public/css/style.css -> http://example.com/css/style.css
Hinweis : Jester serviert nur Dateien, die von others lesbar sind. Auf Unix/Linux können Sie dies mit chmod o+r ./public/css/style.css sicherstellen.
Cookies können mit der setCookie -Funktion eingestellt werden.
get " / " :
# Set a cookie "test:value" and make it expire in 5 days.
setCookie ( " test " , @ " value " , daysForward ( 5 )) Sie können dann mit der request.cookies zugegriffen werden. Kookies -Prozedur, die eine Table[string, string] .
Das Anforderungsobjekt enthält alle Informationen zur aktuellen Anfrage. Sie können mit der request über eine Route zugreifen. Es ist definiert als:
Request * = ref object
params * : StringTableRef # # Parameters from the pattern, but also the
# # query string.
matches * : array [ MaxSubpatterns , string ] # # Matches if this is a regex
# # pattern.
body * : string # # Body of the request, only for POST.
# # You're probably looking for ``formData``
# # instead.
headers * : StringTableRef # # Headers received with the request.
# # Retrieving these is case insensitive.
formData * : MultiData # # Form data; only present for
# # multipart/form-data
port * : int
host * : string
appName * : string # # This is set by the user in ``run``, it is
# # overriden by the "SCRIPT_NAME" scgi
# # parameter.
pathInfo * : string # # This is ``.path`` without ``.appName``.
secure * : bool
path * : string # # Path of request.
query * : string # # Query string of request.
cookies * : StringTableRef # # Cookies from the browser.
ip * : string # # IP address of the requesting client.
reqMeth * : HttpMethod # # Request method, eg. HttpGet, HttpPost
settings * : Settings Mit einem benutzerdefinierten Router können Sie Ihren eigenen Initialisierungscode ausführen und dynamische Einstellungen an Jester übergeben, bevor Sie die asynchronisierte Schleife starten.
import asyncdispatch, jester, os, strutils
router myrouter:
get " / " :
resp " It's alive! "
proc main () =
let port = paramStr ( 1 ). parseInt (). Port
let settings = newSettings (port = port)
var jester = initJester (myrouter, settings = settings)
jester. serve ()
when isMainModule :
main ()Der Code dafür ist dem hier angegebenen Code für Sinatra ziemlich ähnlich: http://help.github.com/post-receive-hooks/
import jester, json
routes:
post " / " :
var push = parseJson ( @ " payload " )
resp " I got some JSON: " & $ push