On Mon, Oct 22, 2012 at 8:32 AM, Helmut Dobretzberger <h.dobretzber...@gmx.at> wrote: > Hey, > > I want to build my new web-application with the racket-webserver, so I have > worked through the continue-tutorial. > Now i want to improve the simple blog from the tutorial to learn more > web-server tecniques which leads to some questions: > > - I've tried to change that application to use templates. (It' would be nice > to include that in the tutorial!) > The relevant part of template with all posts look like this: > > @in[p posts]{ > <div class="post"> > <a href="@????">@(post-title p) > <p>@(post-body p)</p> > <div>@(number->string (length (post-comments p))) comment(s)</div> > </a> > </div> > } > </div> > > What ist he best way to fill the @???? - because that is a specific url for > every post generated by embed/url in the racket-application so it can't be > accessed with selectors like the other parts.
Templates have all of Racket and the scope of the including location available to them. You can just do @embed/url[view-post-handler] and it will work > > - As an alternative, I was thinking about using a url like this > "?id=@(post-id p)" but then i read in the docs that it is not recommended to > use extract-binding/single. But how can i create "permanent-urls" for > linking from other sites etc when i should not use get-parameters? I'd recommend using web-server/dispatch for that purpose. > - As a consequence, I've tried the web-server/dispatch with the > small-example in the docs. (It would also be nice if this topic is treated > in the continue-tutorial) > The example runs successful when starting from drracket: > > (require web-server/dispatch > web-server/servlet-env) > > (define-values (blog-dispatch blog-url) > (dispatch-rules > [("") list-posts] > [("posts" (string-arg)) review-post])) > > (define (list-posts req) > (response/xexpr > `(body "list-posts"))) > > (define (review-post req p) > (response/xexpr > `(body ,(string-append "review-posts " p)))) > > (serve/servlet blog-dispatch > #:servlet-path "/" > #:servlet-regexp #rx"" ;But is this "the right way"? > #:launch-browser? #t) > > > But - how do I run that on the plt-web-server? I have removed the > serve/servlet and added > > > (define interface-version 'v1) > (define timeout +inf.0) > (define start blog-dispatch) > (provide interface-version timeout start) > > > but that leads to the follwing error: > > > servlet-error-responder: contract violation > expected: exn?, given: #<exn:dispatcher> > in: the 2nd argument of > (-> url? exn? response?) > contract from: > <collects>/web-server/configuration/responders.rkt > blaming: > <collects>/web-server/web-config-unit.rkt > at: <collects>/web-server/configuration/responders.rkt:126.2 > > > What do I have to do to run this code on the server? Dynamically required servlets (that use 'plt-web-server') can't customize the server itself. The use of web-server/dispatch requires the server to be customized. (In particular, 'plt-web-server' uses a cgi-bin-like URL structure to associate URLs with servlets and the whole point of web-server/dispatch is to not do that.) You probably shouldn't use the 'plt-web-server' cmdline program for serious sites. Jay -- Jay McCarthy <j...@cs.byu.edu> Assistant Professor / Brigham Young University http://faculty.cs.byu.edu/~jay "The glory of God is Intelligence" - D&C 93 ____________________ Racket Users list: http://lists.racket-lang.org/users