- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在关注 Google App Engine tutorial (这是他们的 complete demo code on GitHub )并希望:
我无法理解:
A) 如何编写重定向代码,在发布问候语后调用该代码,以便重定向到 /greeting/numeric-id 等 URL。
B) 如何编写用户重定向到的详细信息 View 和模板页面,以便显示问候 ID 和图像。
下面的图表显示了我想要做的事情:
这是guestbook.py:
import os
import urllib
from google.appengine.api import images
from google.appengine.api import users
from google.appengine.ext import ndb
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext import blobstore
import jinja2
import webapp2
JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
extensions=['jinja2.ext.autoescape'],
autoescape=True)
DEFAULT_GUESTBOOK_NAME = 'default_guestbook'
def guestbook_key(guestbook_name=None):
"""Constructs a Datastore key for a Guestbook entity with name."""
return ndb.Key('Guestbook', guestbook_name or 'default_guestbook')
class Author(ndb.Model):
"""Sub model for representing an author."""
identity = ndb.StringProperty(indexed=False)
email = ndb.StringProperty(indexed=False)
class Greeting(ndb.Model):
"""A model for representing an individual Greeting entry."""
author = ndb.StructuredProperty(Author)
date = ndb.DateTimeProperty(auto_now_add=True)
avatar = ndb.BlobProperty(indexed=False, required=True)
other = ndb.BlobProperty(indexed=False, required=True)
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.out.write('<html><body>')
guestbook_name = self.request.get('guestbook_name')
greetings = Greeting.query(
ancestor=guestbook_key(guestbook_name)) \
.order(-Greeting.date) \
.fetch(10)
self.response.out.write("""
<form action="/sign?%s"
enctype="multipart/form-data"
method="post">
<label>Avatar:</label>
<input type="file" name="avatar"/><br>
<label>Other Image:</label>
<input type="file" name="other"/><br>
<input type="submit" value="Submit">
</form>
</body>
</html>""" % (urllib.urlencode({'guestbook_name': guestbook_name})))
class Image(webapp2.RequestHandler):
""" Handle image stored as blobs of bytes.
No idea how the template knows to select a particular one. """
def get(self):
avatar_greeting_key = ndb.Key(urlsafe=self.request.get('avatar_id'))
other_greeting_key = ndb.Key(urlsafe=self.request.get('other_id'))
avatar_greeting = avatar_greeting_key.get()
other_greeting = other_greeting_key.get()
if avatar_greeting.avatar:
self.response.headers['Content-Type'] = 'image/png'
self.response.out.write(avatar_greeting.avatar)
elif other_greeting.other:
self.response.headers['Content-Type'] = 'image/png'
self.response.out.write(other_greeting.other)
else:
self.response.out.write('No image')
class Guestbook(webapp2.RequestHandler):
def post(self):
guestbook_name = self.request.get('guestbook_name',
DEFAULT_GUESTBOOK_NAME)
greeting = Greeting(parent=guestbook_key(guestbook_name))
if users.get_current_user():
greeting.author = Author(
identity=users.get_current_user().user_id(),
email=users.get_current_user().email())
avatar = self.request.get('avatar')
avatar = images.resize(avatar, 100, 100)
other = self.request.get('other')
other = images.resize(other, 400, 300)
greeting.avatar = avatar
greeting.other = other
greeting.put()
query_params = {'guestbook_name': guestbook_name}
self.redirect('/greeting/%d' % greeting.key.id())
class Detail(webapp2.RequestHandler):
""" Individual greeting. """
def get(self, *args, **kwargs):
guestbook_name = self.request.get('guestbook_name', DEFAULT_GUESTBOOK_NAME)
greeting = Greeting.get_by_id(args[0],
parent=guestbook_key(guestbook_name))
template_values = {
'greeting': greeting,
}
template = JINJA_ENVIRONMENT.get_template('detail.html')
self.response.write(template.render(template_values))
app = webapp2.WSGIApplication([
('/', MainPage),
('/img', Image),
('/sign', Guestbook),
('/greeting/(\d+)', Detail),
], debug=True)
我的detail.html模板:
<!DOCTYPE html>
{% autoescape true %}
<html>
<head>
<title>Greeting {{ greeting.id }}</title>
</head>
<body>
<h2>Greeting {{ greeting.id }}</h2>
Avatar: <img src="/img?avatar_id={{ greeting.key.urlsafe() }}">
<br>
Other: <img src="/img?other_id={{ greeting.key.urlsafe() }}">
</body>
</html>
{% endautoescape %}
我的app.yaml以防万一有用:
runtime: python27
api_version: 1
threadsafe: true
# Handlers match in order, put above the default handler.
handlers:
- url: /stylesheets
static_dir: stylesheets
- url: /.*
script: guestbook.app
libraries:
- name: webapp2
version: latest
- name: jinja2
version: latest
错误:
Traceback (most recent call last):
File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__
rv = self.handle_exception(request, response, e)
File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__
rv = self.router.dispatch(request, response)
File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__
return handler.dispatch()
File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "/Users/simon/Projects/guestbook/guestbook.py", line 111, in get
self.response.write(template.render(template_values))
File "/Users/simon/Projects/google-cloud-sdk/platform/google_appengine/lib/jinja2-2.6/jinja2/environment.py", line 894, in render
return self.environment.handle_exception(exc_info, True)
File "/Users/simon/Projects/guestbook/detail.html", line 9, in top-level template code
Avatar: <img src="/img?avatar_id={{ greeting.key.urlsafe() }}">
UndefinedError: 'None' has no attribute 'key'
任何帮助,或者更好的示例代码,将不胜感激。包含详细示例代码以及 ListView 和模板的 GAE/webapp2 博客教程会很棒,但也许 GAE BlobStore 的数据结构不适合博客?
更新:如果我添加 Dan 的答案中提供的 python 检查代码,我会得到 500 错误而不是堆栈跟踪,如果我尝试模板检查,我会得到一个空白的问候页面。我已经用完整的代码和解释我想要做什么的图表更新了问题。
最佳答案
我将从B
开始:
该错误表明greeting
值为None
,导致jinja2尝试扩展中的
。greeting.key
时出现异常模板渲染期间的 {{greeting.key.urlsafe() }}
一种选择是重新安排处理程序代码,以防止在不满足必要条件时呈现该模板,也许是这样的:
...
greeting = Greeting.get_by_id(args[0])
if not greeting or not isinstance(greeting.key, ndb.Key):
# can't render that template, invalid greeting.key.urlsafe()
webapp2.abort(500)
return
template_values = {
'greeting': greeting,
}
template = JINJA_ENVIRONMENT.get_template('detail.html')
self.response.write(template.render(template_values))
...
或者,您可以通过适当的检查来包装引用变量的模板区域(恕我直言,更丑陋、更困难、更脆弱,不过 - python 比 jinja2 更适合这种逻辑),大致如下:
{% if greeting and greeting.key %}<img src="/img?avatar_img_id={{ greeting.key.urlsafe() }}">{% endif %}
现在到A
。
简而言之 - 这不是一个好主意,主要是因为您尝试在 URL 中使用的数字 ID 不是唯一的,除了同一父实体下的问候语!>。这在某种程度上解释了为什么问候语无效,导致 B
答案出现错误。
除非您还使用传入 的 ID 创建了问候语实体,否则
和没有父级!greeting = Greeting.get_by_id(args[0])
将返回 None
args[0]
为了通过 ID 获取您创建的问候语:
greeting = Greeting(parent=guestbook_key(guestbook_name))
您需要调用:
greeting = Greeting.get_by_id(args[0],
parent=guestbook_key(guestbook_name))
如果您想继续朝同一方向继续,您还可以对问候语 URL 中的 guestbook_name
进行编码,这样您还可以获取所需的父 key ,也许是这样的:
/guestbook/<guestbook_name>/greeting/<numeric-id>.
您还需要仔细研究图像处理。您存在架构不一致的情况:在图表和模型中,您将头像和另一个图像附加到单个问候语实体,但在 Image
处理程序中,它们每个都附加到单独的问候语。该处理程序也根本不映射到图像的 URL(这还需要对定位适当图像所需的数据进行额外的编码,具体取决于架构决策)。
恐怕你还有很多工作要做,直到你让整个事情发挥作用,这远远超出了解决一个单一问题的范围。退后一步,重新思考您的架构,将其分成更小的部分,一次专注于一个部分并开始运行。当您熟悉各个部分的技术后,您会感觉更好地立即解决整个问题。
关于python - 如何在 Google App Engine webapp2 留言簿教程中制作 'permalink' 详细信息页面显示两个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36272486/
我有一个在 Tomcat 7.0.54 上运行的 Java webapp。我在 webapp 中使用 Spring。当用户登录到/favicon.ico 时。当用户第二次登录时,他们将被重定向到正确的
如何使用通用的 webappclassloader 为 tomcat 中的所有 webapps 自定义 webapp 类加载器? 我看到我可以扩展类加载器并将其添加到每个 web 应用程序的上下文标记
我有一个 jquery mobile 和 php webapp,可以在 iOS7 中正常工作。我最近升级到 iOS8 进行一些测试,但我遇到了状态栏现在与 Web 应用程序标题重叠的问题。这似乎也导致
我注意到这些文件夹具有非常不同的属性。我最近在 webapps 文件夹下部署了一个 .war 文件。我注意到,一旦部署了 .war 文件,项目的未压缩版本就会添加到目录中。当我尝试修改未压缩版本中的任
假设您在本地主机的 Tomcat 上部署了一个名为 MyWebApp 的网络应用程序。如果您像这样使用浏览器访问它: localhost:8080/MyWebApp 那为什么会显示index.html
我正在寻找一种提示/解决方案来生成一个具有自定义设计的模板 Web 应用程序,然后我所有其他 Web 应用程序都应该采用模板 Web 应用程序的设计。那可能吗?背后的想法是,我们有多个用于项目的 We
我有一扇 Azure 前门。主要区域有一个 azure 功能,辅助区域有一个功能应用程序。当这两个功能都启动时,它工作正常。它正在向每个区域分配 50-50 个负载。但是当我故意停止主要功能时。所有流
这个问题已经有答案了: Getting Python error "from: can't read /var/mail/Bio" (7 个回答) 已关闭去年。 几天前我开始使用 python nfl
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个在 Apache Tomcat 5.5 中完美运行的 Web 应用程序,我需要“转换它”以便它可以部署在 Oracle 应用服务器 10.1.3 中。 现在我制作了一个应用程序的 WAR 文件
我在 jsp 中有 2 个 webapps,其中一个供公共(public)使用,另一个供本地使用。 是否可以在 Apache tomcat 中的一个端口上托管一个 Web 应用程序而在另一个端口上托管
最近,我一直在对模块化JS进行大量试验,但我仍然想知道是否以“正确的方式”编写它。 例如,如果我有一个页面,其中包含输入和提交按钮,这些页面应在提交后显示数据(例如表格和图形),所以我在IFFE下编写
我有一个部署为 web 应用程序的 google 脚本。此 webapp 需要发送带有 webapp 的 URL 的电子邮件,以便收件人可以使用 URL 访问 webapp。如何获取 webapp 中
我们正在部署在.Net core中开发的微服务,并将部署在Azure WebApp中 这些 WebApp 之间将进行大量通信。 现在,由于 WebApp 面向互联网,它们之间的所有调用都将通过互联网,
这个问题已经有答案了: SEVERE: Failed to initialize Jenkins [closed] (1 个回答) 去年关闭。 我在 Ubuntu 12.04 中安装了 Jenkins
我看到一个奇怪的问题。我有两个网络应用程序。一个用于我们使用 Jersey 公开的其余 Web 服务。另一个具有 JSF 前端实现,它调用上面的 web 服务来获取详细信息。我们使用 Tomcat 作
这是我在探索工作场所中某些任务自动化的世界时遇到的一个普遍问题。 我们的企业网站上有一个门户/启动板环境,其中的应用程序显示为图 block 。 其中一个应用程序打开后有一个主页,其中有一堆搜索字段和
我有两个 Google 电子表格,每个电子表格都附加了一些 Apps 脚本。最终,我想将两者部署为 Web 应用程序,以便它们可以通过其公共(public) URL 相互通信。目前,我只部署了其中一个
当我尝试运行 ngserve 时,我得到以下信息 ERROR in ./src/main/webapp/manifest.webapp Module parse failed: /home/ferga
这个问题在这里已经有了答案: Eclipse Output Folders (6 个答案) 关闭 5 年前。 我正在使用 Tomcat 5,当我启动服务器并从 webapp 文件夹加载我的应用程序时
我是一名优秀的程序员,十分优秀!