What steps will reproduce the problem?
1. Add the following route to your app:
app = webapp2.WSGIApplication([
webapp2.Route(r'/logout/<page_id:.*>', handler=views.LogoutPage, name='logout', defaults={'page_id': ''})
], debug=True)
2. Add the following view to your app (located in views.py):
class LogoutPage(webapp2.RequestHandler):
def get(self, page_id=''):
return self.redirect('/' + page_id)
3. Create a custom Jinja2 template filter like this:
def url(name, **kwargs):
return webapp2.uri_for(name, **kwargs)
4. Create a Jinja2 template with the following line:
<a href="{{ 'logout'|url(page_id='') }}">logout</a>
What is the expected output? What do you see instead?
I expect to see the correct URI for the handler when the template is rendered.
Instead I get this:
File "/base/data/home/apps/s~myapp/5/templates/base_back_admin.html", line 12, in block "link_area"
<a href="{{ 'logout'|url(page_id='') }}">logout</a>
File "/base/data/home/apps/s~myapp/5/tags.py", line 368, in url
return webapp2.uri_for(name, **kwargs)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1706, in uri_for
return request.app.router.build(request, _name, args, kwargs)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1224, in default_builder
return route.build(request, args, kwargs)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 978, in build
path, query = self._build(args, kwargs)
File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1002, in _build
name.strip('_'))
KeyError: 'Missing argument "page_id" to build URI.'
What version of the product are you using? On what operating system?
I am using the webapp2 module included in the GAE SDK v1.7.5 with Python 2.7 on
a Mac OS X Snow Leopard (10.6.8).
Please provide any additional information below.
This works flawlessly in the development SDK but fails with the above error on
GAE production servers. As you can see from my code, I used the defaults
parameter in the url pattern to send a default page_id argument to the view. I
also gave the page_id parameter in the view definition a default value. Then I
even sent the page_id value manually as an argument in the url function called
from the template filter. I tried every combination of one or more of these
three methods, but the production app still claims the page_id argument is
missing. I don't know what to do since this works on the development server.
Original issue reported on code.google.com by cpatters...@gmail.com on 5 Mar 2013 at 11:31
Original issue reported on code.google.com by
cpatters...@gmail.com
on 5 Mar 2013 at 11:31