5 ms·
Seems appropriate to link this here: https://docs.pylonsproject.org/projects/pyramid/1.2/designdefense.html#microframeworks-have-smaller-hello-world-programs h
by mcdonc 15y ago
Seems appropriate to link this here: https://docs.pylonsproject.org/projects/pyramid/1.2/designdefense.html#microframeworks-have-smaller-hello-world-programs https://docs.pylonsproject.org/projects/pyramid/1.2/designde...
- anthonyb 15y agoSeems pretty defensive to me. How does, say, separating out the route and the view declarations help your application? Code like this: config = Configurator() config.add_route('hello', '/hello/{name}') config.add_view(hello_world, route_name='hello') is really just boilerplate, which is better done as a decorator. Count how many times the word 'hello' appears in that snippet above. And this is just for a hello world program. Once you start on a real app, that's only going to multiply.
- mcdonc 15y agoIn a more traditional Pyramid app it would be done more like: from pyramid.view import view_config from pyramid.response import Response from paste.httpserver import serve @view_config(route_name='hello') def hello_world(request): return Response('Hello %(person)s' % request.matchdict) if __name__ == '__main__': config = Configurator() config.add_route('hello', '/hello/{person}') config.scan() serve(config.make_wsgi_app()) The config.scan() bit causes the @view_config decorators to be picked up. So we do have some decorators, although they don't populate an external registry (by design). The rationale for putting the route ordering in imperative code instead of using decorator declaration order is in the document I linked. I'm not particularly interested in crippling Pyramid for larger apps to race to the bottom of the LOC count. It's succinct enough and works for truly large apps too.
- mmerickel 15y agoThe ordering of your patterns matters, so that is done at config time. However it's very common to want to have unrelated code executed depending on the type of request to a URL. Pyramid will do this lookup for you, rather than polluting a gigantic view function with multiple code-paths for distinct functionality. @view_config(route_name='hello', request_method='GET') def get_hello(request): return Response('a GET request for %s' % request.matchdict['name']) @view_config(route_name='hello', request_method='POST') def post_hello(request): return Response('stored info') config = Configurator() config.add_route('hello', '/hello/{name}') config.scan() app = config.make_wsgi_app()
- mcdonc 15y agoBottle and Flask actually allow for this too. Bottle's variant: @route('/hello/:name', method='GET') def hello_get(name): return 'Hello %s' % name @route('/hello/:name', method='POST') def hello_post(name): return 'Hello %s' % name Pyramid permits a larger variety of predicates (including custom ones), however: https://docs.pylonsproject.org/projects/pyramid/1.2/narr/viewconfig.html#predicate-arguments https://docs.pylonsproject.org/projects/pyramid/1.2/narr/vie...
- mmerickel 15y agoYes but while implicit route ordering works a lot of the time, I'll gladly keep Pyramid's concept of explicit ordering, which is the main source of verbosity in the Pyramid setup which separates routes from views.
- mcdonc 15y agoThe order the decorators are run at import time is explicit. Everybody loves module-scope programming and import-time side-effects! What's wrong with you man? ;-)