Как перенаправить в webapp2
Здравствуйте, я изучаю webapp2, я сомневаюсь, что есть три страницы 1: /blog для просмотра всех опубликованных блогов, которые связаны с их постоянной ссылкой 2: /blog/newpost для получения newpost для блога, он содержит только заголовок и блог в качестве входных данных в то время как пользователь нажимает кнопку "Отправить", он перенаправляет на некоторую постоянную ссылку (это работает!!!) 3: и последний - /blog/(somepermalink), где пользователь перенаправляется на эту страницу на шаге 2
Моя проблема - первая страница, где представлен весь список созданных блогов, и когда пользователь нажимает на какой-нибудь блог, я хочу перенаправить его на шаг 3, но, к сожалению, он дает мне ошибку 404. Вот мои коды
class Handler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
def render_str(self, template, **params):
t = jinja_env.get_template(template)
return t.render(params)
def render(self, template, **kw):
self.write(self.render_str(template, **kw))
class Blog(db.Model):
title = db.StringProperty(required = True)
blog = db.TextProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
class MainPage(Handler):
def render_front(self, title="", blog="", error=""):
self.render("newpost.html", title=title, blog=blog, error=error)
def get(self):
self.render_front()
def post(self):
title = self.request.get("title")
blog = self.request.get("blog")
if title and blog:
a = Blog(title=title, blog=blog)
a_key = a.put()
#sleep is used because of replication lag time
sleep(0.1)
#redirect to some permalink
self.redirect("/blog/%d" % a_key.id())
else:
error = "both title and post are needed"
self.render_front(title, blog, error)
class BlogPostHandler(Handler):
def render_blog(self, title="", blogs=""):
blogs = db.GqlQuery("SELECT * FROM Blog ORDER BY created DESC")
self.render("blogpage.html", title=title, blogs=blogs)
def get(self):
self.render_blog()
class PermaLink(MainPage):
def get(self, blog_id):
s = Blog.get_by_id(int(blog_id))
self.render("blogpage.html", blogs = [s])
app = webapp2.WSGIApplication([('/blog',BlogPostHandler),
('/blog/newpost',MainPage),
('/blog/(\d+)', PermaLink)],
2 ответа
Возможно, стоит упомянуть, добавив к первому ответу: можно выбрать большую гибкость при выборе расширенных маршрутов:
app = webapp2.WSGIApplication([
webapp2.Route(r'/blog', handler=BlogPostHandler, name='BlogPost'),
webapp2.Route(r'/blog/newpost', handler=MainPage, name='MainPage'),
webapp2.Route(r'/blog/<:\d+>', handler=PermaLink, name='PermanentLink'),
])
Последняя строка выше указывает путь к / blog /, так же, как ваш исходный код. Если вы хотите указать любой возможный путь после / blog /, вы должны использовать Route r'/blog/<:.*>'
вместо.
В предоставленном вами коде нет ничего очевидного, что указывало бы на наличие ошибки. Так как перенаправление в вашем MainPage
обработчик запросов правильно перенаправляет и загружает сообщение в блоге, я подозреваю, что проблема в том, как вы создаете ссылки в шаблоне jinja2, используемом BlogPostHandler
, Вот несколько вещей, на которые стоит обратить внимание:
- Ссылки используют
/blog/
вместо/blogs/
(Множественное число). - Случайный пробел в вашей ссылке:
/blog/ 1234
, - Вы используете абсолютные ссылки вместо относительных ссылок.
- Абсолютные:
href="/blog/{{ post.id }}"
(ведущий/
) - Родственник:
href="blog/{{ post.id }}"
(без ведущих/
, который будет ссылаться на/blog/blog/<id>
)
- Абсолютные:
- Идентификатор поста блога отображается как целое число, а не как длинный, что может произойти при использовании хранилища данных Google App Engine.
- Integer:
/blog/1234
- Долго:
/blog/1234L
- Integer: