- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 python 文件和一个 html 文件,它们通过 jinja2 环境以类似于 this tutorial 中的方式相互交互。 .
以下代码控制html文件和python文件之间的交互:
class MainPage(webapp2.RequestHandler):
def get(self):
submission_query = Submission.query().order(-Submission.score)
submissions = submission_query.fetch(10)
template_values = {
'Submission' : Submission,
'submissions' : submissions,
}
template = JINJA_ENVIRONMENT.get_template('index.html')
self.response.write(template.render(template_values))
app = webapp2.WSGIApplication([
('/', MainPage),
('/create', CreateSubmmission),
('/voteup', VoteUp),
], debug=True)
我有一个ndb模型如下:
class Submission(ndb.Model):
username = ndb.StringProperty()
placename = ndb.StringProperty()
link = ndb.StringProperty()
score = ndb.IntegerProperty()
我有一个 html 表单来创建新的提交,如下所示:
<form action="/create" method="post">
add a new location: <br>
your name:<div><textarea name="username" rows="2" cols="60"></textarea></div>
placename:<div><textarea name="placename" rows="2" cols="60"></textarea></div>
url:<div><textarea name="link" rows="2" cols="60"></textarea></div>
<div><input type="submit" value="Post"></div>
</form>
使用此请求处理程序:
class CreateSubmmission(webapp2.RequestHandler):
def post(self):
submission = Submission()
submission.username = self.request.get('username')
submission.placename = self.request.get('placename')
submission.link = self.request.get('link')
submission.score = 0
submission.put()
self.redirect('/')
我的 html 中有一个部分,它打印出每个提交内容以及一个用于投票的按钮:
{% for Submission in submissions %}
<p>
{{Submission.username}} posted:
<strong><a href="{{Submission.link}}">{{Submission.placename}}</a></strong> <br>
score:{{Submission.score}}<br>
<!--Vote up button-->
<form action="/voteup?submission={{Submission}}" method="post">
<div><input type="submit" value="voteup"></div>
</form>
</p><br><br>
{% endfor %}
投票由以下 python 类处理:
class VoteUp(webapp2.RequestHandler):
def post(self):
submission = self.request.get('Submission')
submission_key = submission.put()
the_submission = submission_key.get()
the_submission.score +=1
the_submission.put()
self.redirect('/')
按下按钮时,相应提交的分数属性值应增加 1。
代码在网站sunlit-hook-91816.appspot.com上实现。从该网站上可以看出,按下“赞成”按钮会生成以下错误:
File "/base/data/home/apps/s~sunlit-hook-91816/1.383863233180213164/guestbook.py", line 52, in post
submission_key = submission.put()
AttributeError: 'str' object has no attribute 'put'
VoteUp 类似乎无法修改 Submission.score 的值。
我正在使用找到的信息here但我不知道如何正确应用它这个问题。谁能告诉我一种让 VoteUp 类修改 Submission.score 的方法?
最佳答案
您正在使用提交对象,就像它可以在 html/python 代码之间传递一样,但它不能,您必须在表单中添加引用并在服务器中取消引用它。
在投票表中执行此操作:
<form action="/voteup?submission={{Submission.key.urlsafe()}}" method="post">
<div><input type="submit" value="voteup"></div>
</form>
我们在 format safe for http transport 中获取提交的 key ,因此它可以原封不动地返回到服务器。
现在在处理投票时,我们可以重新创建 key 并获取正确的对象:
class VoteUp(webapp2.RequestHandler):
def post(self):
submission = self.request.get('submission')
submission_key = ndb.Key(urlsafe=submission)
the_submission = submission_key.get()
the_submission.score +=1
the_submission.put()
self.redirect('/')
如您所见,我们只是根据表单中打印的格式化字符串重新创建 key 。
另一种让它变得更好的方法是在表单中使用额外的输入:
<form action="/voteup" method="post">
<input name="submission" type="hidden" value="{{Submission.key.urlsafe()}}">
<div><input type="submit" value="voteup"></div>
</form>
您的代码将以相同的方式工作,但我发现它更易于阅读和维护。
关于python - 如何通过 python 中的 webapp2 处理程序修改 ndb 模型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871759/
如果我有一个具有以下定义的Contact 模型: class Contact(ndb.Model): name = ndb.TextProperty(indexed=False) we
我有 webapp2 服务,它在多个不相互依赖的 NDB 模型中插入条目。现在我们要求的是服务应该在事务中。那是服务失败然后它应该恢复完整的交易(例如,如果一个条目插入到第一个和第二个模型中,并且在该
切换到 python GAE 上的 ndb 库。 我可以将 ndb 与之前使用低级 api 创建的实体一起使用吗?还是我必须复制所有旧实体并重新保存它们才能使用 ndb? 谢谢! 最佳答案 ndb 只
是否可以在 pre_put_hook 中找出实体的脏因子? 我想根据put 的内容有条件地执行一些回调。例如。如果实体的特定属性发生更改,我想发送邮件通知。我可以在调用 put() 之前手动执行此操作
我是谷歌应用引擎和 NDB 的初学者。我的问题:如果我在模型中有 1 个实体, 我想防止 2 个并行操作时发生冲突,代码示例: class MyModel(ndb.Model) count = n
假设有一个看起来像这样的 ndb.Model: class Foo(ndb.Model): bar = ndb.StringProperty() 我的问题是,如果我的唯一输入是 Foo.query
给定我构造的 key ,我想访问数据存储区以查看它是否存在,但我想要最便宜(及时)的方法来做到这一点。我正在寻找的就像一个只有键的查询,但是来自 get,例如my_key.get(keys_only=
https://developers.google.com/appengine/docs/python/ndb/ https://developers.google.com/appengine/doc
我有一个 ndb.Model,它有一个 ndb.DateTimeProperty 和一个 ndb.CompulatedProperty,它使用 ndb.DateTimeProperty 创建时间戳。
我计划将 Odoo 移植到 Google App Engine Web 应用程序。当我知道 Odoo 使用 postgresql 时,是否可以将数据库连接、查询和所有从 Postgresql db 移
我有一个 POST 方法,它调用一些 tasklet。这些 tasklet 确实有 yield ,我的代码中确实有一些 x.put_async()。所以我不希望它在所有异步内容完成之前返回。所以我用
我有一个简单的 NDB 模型: from google.appengine.ext import ndb import logging from libs import Api class User(
使用 Python NDB 的新手。 我有类似的东西: class User(ndb.Model): seen_list = nbd.KeyProperty(kind=Survey, repe
我的应用程序中有以下查询 query = cls.query().filter(cls.taskgroup_id == taskgroup_id, cls.availability == True,
我在 NDB 迁移方面遇到问题。目前,我在 NDB Cluster 中有 2 个副本。我想将集群移至新硬件中。因此,在新机器中,我设置了 datanodes 和 sqlnodes 并将管理节点指向旧集
我有一个 mysql ndb 集群(详情如下)。问题是当我做最简单的事情时,例如恢复使用 mysqldump 转储的数据库,它需要绝对的时间! IE 6 小时恢复一个大小为 745MB 且在大约 30
来自 What can be done in a transaction (我的重点): All Datastore operations in a transaction must operate
我正在对 Expense 模型的方法进行单元测试。模型的相关部分如下所示: class Expense(ndb.Model): user = ndb.KeyProperty(User, req
几年来,我一直在使用类似于下面复制的代码片段。 基本思想是 Person 可以结婚,当他们结婚时,我创建一个“Marriage”实体。一个人只能结婚一次,所以我有一个 bool 值来指示这个人是否已婚
我们使用的是 ndb 数据存储、python、标准谷歌应用引擎。我们想使用查询游标。但是为了根据 here 工作和 here ,看起来我们需要实现 datastore_model.query().or
我是一名优秀的程序员,十分优秀!