Low-level web programming in Racket and a wiki in 500 lines
matt.might.net
matt.might.net
[0] Tokyo Art Parties parsed out of Tokyo art beat events xml - https://github.com/minikomi/tokyoartparties-rkt/blob/master/...
The documentation discusses the features of the Web framework, many of which have to do with its unique aspects. As you can see in this post, all normal Web programming is possible and easy, but there's very little special to say about it, because it's just a normal program.
If anyone here has experience with web stuff in Racket, I've set up a small skeleton for Racket web projects: https://github.com/samertm/web-project-bootstrap.rkt
Right now it contains skeletons for talking to sqlite, setting up a router and handlers, and manipulating the web server from the command line. I need to add an ORM (I'm not sure if Racket has any up-to-date ORMs?) and static file handlers. I'd love help or feedback!
~ $ ab -n 100 -c 10 "http://localhost:8888/"
This is ApacheBench, Version 2.3 <$Revision: 1638069 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient).....done
Server Software: Racket
Server Hostname: localhost
Server Port: 8888
Document Path: /
Document Length: 89 bytes
Concurrency Level: 10
Time taken for tests: 0.084 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 26800 bytes
HTML transferred: 8900 bytes
Requests per second: 1192.32 [#/sec] (mean)
Time per request: 8.387 [ms] (mean)
Time per request: 0.839 [ms] (mean, across all concurrent requests)
Transfer rate: 312.05 [Kbytes/sec] received
For example here are benchmarks from Django's single-threaded debug webserver:
Benchmarking 127.0.0.1 (be patient).....done
Server Software: WSGIServer/0.1
Server Hostname: 127.0.0.1
Server Port: 8000
Document Path: /
Document Length: 2 bytes
Concurrency Level: 10
Time taken for tests: 0.100 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 16400 bytes
HTML transferred: 200 bytes
Requests per second: 998.90 [#/sec] (mean)
Time per request: 10.011 [ms] (mean)
Time per request: 1.001 [ms] (mean, across all concurrent requests)
Transfer rate: 159.98 [Kbytes/sec] received
Or Nginx returning the same thing:
Benchmarking 127.0.0.1 (be patient).....done
Server Software: nginx/1.6.2 Server Hostname: 127.0.0.1 Server Port: 9080
Document Path: /gangam Document Length: 14 bytes
Concurrency Level: 10 Time taken for tests: 0.013 seconds Complete requests: 100 Failed requests: 0 Total transferred: 15600 bytes HTML transferred: 1400 bytes Requests per second: 7478.31 [#/sec] (mean) Time per request: 1.337 [ms] (mean) Time per request: 0.134 [ms] (mean, across all concurrent requests) Transfer rate: 1139.27 [Kbytes/sec] received
BTW, this is what I mean by form bindings being confusing: according to the docs, request-bindings is dangerous and shouldn't be used http://docs.racket-lang.org/web-server/http.html#%28mod-path... . That's kind of confusing, because request-bindings is used in the tutorial docs: http://docs.racket-lang.org/continue/#%28def._%28%28lib._web...
And the function that Matt Might uses, request-post-data/raw, isn't even in the docs! Haha, so handling forms has been a bit of a pain for me :)
For your boilerplate, you may want to add bunch of options to serve/servlet such static files path, stateless? (to not use continuations) etc...
http://docs.racket-lang.org/web-server/http.html?q=request#%...
Last time I checked (which was, admittedly, a long time ago) it served noticeably fewer "hello, template world" requests per second than Flask running on Python 2.7 while using more RAM. This was a pity to me because I thought Racket could otherwise be a very interesting language for web development.
You should be able to do the same thing with:
(ormap password-matches? line)
0 - http://docs.racket-lang.org/reference/pairs.html?q=ormap#%28... ; extract the URI from the request:
(define uri (request-uri req))
; extract the resource from the URI:
(define resource
(map path/param-path (url-path uri)))
; find the file location:
(define file (string-append
document-root
"/"
(string-join resource "/")))http://docs.racket-lang.org/scribble/config-style.html?q=css