On May 22, 2:33 am, Shannon -jj Behrens <[email protected]> wrote:
> I have a project in production, and I decided to upgrade my app from
> 0.9.6.1 to 0.9.7.  I read all the docs related to upgrading.  I
> decided to use "paster create myapp -t pylons" to upgrade my project.
> These are the headaches I encountered:
>
>  * Warn people that if they use paster create to upgrade their project, they
>    probably don't want to override base.py.  After all, paster create doesn't
>    update your controllers, and my controllers depended on the imports in
>    base.py.
>
>  * AttributeError: 'module' object has no attribute 'url_for'
>    I was using "h.url_for" in a controller.  It's even mentioned in
>    http://wiki.pylonshq.com/pages/viewpage.action?pageId=11174779
>    (which is probably a bug).  I didn't find any mention in the upgrading docs
>    that this was gone.  I added "from routes import url_for" to my helpers.py.
>
>  * The jsonify decorator sets the Content-Type header, but it doesn't
>    specify a charset.  Paste freaks out if you do that.  Here's what my
>    controller does to work around that problem:
>
>     def _jsonify(self, s):
>         """This converts the jsonify decorator into a normal method.
>
>                 Sometimes a decorator isn't what I need, and treating a 
> function
>                 decorator as a normal function is funky.
>
>         HACK: The jsonify decorator sets the Content-Type header, but it
>         doesn't specify a charset.  Paste freaks out if you do that.
>
>         """
>         ret = jsonify(lambda: s)()
>         response.headers['Content-Type'] = 'application/json; charset=UTF-8'
>         return ret

I'm using @jsonify as-is and haven't seen this problem.


>  * I updated my imports in helpers.py per the upgrading docs, but I was a bit
>    surprised to find out that stylesheet_link_tag was gone.  It's been renamed
>    stylesheet_link.
>
>  * Since I decided to keep my old base.py (since I like the automatic 
> imports),
>    I had to manually change how I imported render to
>    "from pylons.templating import render_mako as render".  The old render
>    function is still available, and it's different from the new render
>    function.  I'm guessing this isn't a big deal.
>
>  * I had code that was setting response.status_code.  It's documented here
>    http://wiki.pylonshq.com/pages/viewpage.action?pageId=11174779that you
>    should use status_int.  However, I didn't catch that and there was no
>    deprecation warning.  Hence, my code failed silently, or rather it didn't
>    fail at all.  It returned a 200 when I was trying to return a 400.  A
>    deprecation warning would have been nice.
>
>  * Once I got response.status_code working, it started shoving my HTML
>    response into the middle of a big error template instead of just serving
>    what I had.  This totally messed with my Web service which counts on
>    the sparse HTML error messages I provide.  I hacked around the problem.
>    In my action, I wrote:
>
>        request.environ['error_response_is_intentional'] = True
>
>    In error.py's document method, I wrote:
>
>        resp = request.environ['pylons.original_response']
>        if request.environ.get('error_response_is_intentional', False):
>            page = resp.body
>        else:
>            content = literal(resp.body) or
> cgi.escape(request.GET.get('message', ''))
>            page = error_document_template % \
>                dict(prefix=request.environ.get('SCRIPT_NAME', ''),
>                     code=cgi.escape(request.GET.get('code',
> str(resp.status_int))),
>                     message=content)
>        return pag
>
>    This is definitely a hack.  I'm not even sure why this behavior changed.
>    If I set request.status_code, and I set the HTML containing the error
>    message, it should just leave it alone.

One of the default middlewares is doing this--StatusCodeRedirect. I
completely removed this from the Pylons project I'm using for web
services.

In another project, I have this in certain controllers:

    request.environ['pylons.status_code_redirect'] = True

I found that by reading the source. If I understand it correctly, it
disables StatusCodeRedirect for a given request. (It seems to work,
but the semantics are confusing.)


>    By the way, why does the code use
>    request.environ.get('pylons.original_response') when it soon does
>    resp.body?  Why not do a normal dict lookup (i.e. [])?  If you don't have
>    that key, you'll get a None, and resp.body will crash anyway.
>
> Ok, I hope that was helpful.  If you want bugs for any of these, I'm
> happy to submit them.
>
> Best Regards,
> -jj
>
> --
> In this life we cannot do great things. We can only do small things
> with great love. -- Mother Teresahttp://jjinux.blogspot.com/
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/pylons-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to