Я собираюсь добавить свое решение к этому как бесплатный ответ поверх @ moraes.
Так что другие люди, имеющие проблемы, подобные приведенным ниже, могут получить более полный ответ.
- Проблема с косой чертой
- Проблема с дополнительными параметрами
Кроме того, я понял, какroute и /entity/create
и /entity/edit/{id}
в одном регулярном выражении.
Ниже приведены мои маршруты, которые поддерживают следующие шаблоны URL.
- /
- / myentities
- / myentities /
- / myentities / create
- / myentities / create /
- / myentities / edit / {entity_id}
SITE_URLS = [
webapp2.Route(r'/', handler=HomePageHandler, name='route-home'),
webapp2.Route(r'/myentities/<:(create/?)|edit/><entity_id:(\d*)>',
handler=MyEntityHandler,
name='route-entity-create-or-edit'),
webapp2.SimpleRoute(r'/myentities/?',
handler=MyEntityListHandler,
name='route-entity-list'),
]
app = webapp2.WSGIApplication(SITE_URLS, debug=True)
Ниже мой BaseHandler
, от которого наследуются все мои обработчики.
class BaseHandler(webapp2.RequestHandler):
@webapp2.cached_property
def jinja2(self):
# Sets the defaulte templates folder to the './app/templates' instead of 'templates'
jinja2.default_config['template_path'] = s.path.join(
os.path.dirname(__file__),
'app',
'templates'
)
# Returns a Jinja2 renderer cached in the app registry.
return jinja2.get_jinja2(app=self.app)
def render_response(self, _template, **context):
# Renders a template and writes the result to the response.
rv = self.jinja2.render_template(_template, **context)
self.response.write(rv)
Ниже мой класс MyEntityHandler
python с get()
сигнатурой метода для API хранилища данных Google App Engine .
class MyEntityHandler(BaseHandler):
def get(self, entity_id, **kwargs):
if entity_id:
entity = MyEntity.get_by_id(int(entity_id))
template_values = {
'field1': entity.field1,
'field2': entity.field2
}
else:
template_values = {
'field1': '',
'field2': ''
}
self.render_response('my_entity_create_edit_view_.html', **template_values)
def post(self, entity_id, **kwargs):
# Code to save to datastore. I am lazy to write this code.
self.redirect('/myentities')