【问题标题】:How can I handle delete in Google App Engine - Python如何在 Google App Engine 中处理删除 - Python
【发布时间】:2014-11-10 13:57:41
【问题描述】:

我正在尝试在留言簿上实现一个删除按钮,用户可以在其中删除他们的 cmets,如果他们愿意并且收到以下错误。我是 GAE/python 的新手,提供的任何帮助将不胜感激。我的环境是在 windows 8 上运行的 python 2.7 api 版本 1。

Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "C:\Program Files\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "D:\Projects\python\guestideabook\guestideabook.py", line 87, in post
    item = ndb.get(key)
AttributeError: 'module' object has no attribute 'get'

源代码: guestideabook.py

import jinja2
import os
import webapp2
import datetime


from google.appengine.api import users
from google.appengine.ext import ndb


# We set a parent key on the 'Greetings' to ensure that they are all in the same
# entity group. Queries across the single entity group will be consistent.
# However, the write rate should be limited to ~1/second.

def Guestideabook_key(Guestideabook_name='default_Guestideabook'):
    return ndb.Key('Guestideabook', Guestideabook_name)

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'],
    autoescape=True)

class Greeting(ndb.Model):
    author = ndb.UserProperty()
    content = ndb.StringProperty(indexed=False)
    date = ndb.DateTimeProperty(auto_now_add=True)




class MainPage(webapp2.RequestHandler):
    def get(self):
        greetings_query = Greeting.query(ancestor=Guestideabook_key()).order(-Greeting.date)
        greetings = greetings_query.fetch(10)

        if users.get_current_user():
            url = users.create_logout_url(self.request.uri)
            url_linktext = 'Logout'


           #print ("Current date & time = %s" % i)e


        else:
            url = users.create_login_url(self.request.uri)
            url_linktext = 'Login'

        template = jinja_environment.get_template('index.html')
        self.response.out.write(template.render(greetings=greetings,
                                                url=url,
                                                url_linktext=url_linktext))




class Guestideabook(webapp2.RequestHandler):
    def post(self):
        greeting = Greeting(parent=Guestideabook_key())

        if users.get_current_user():
         greeting.author = users.get_current_user()

        greeting.content = self.request.get('content')

        greeting.put()


        self.redirect('/')


class DelHandler(webapp2.RequestHandler):
  def post(self):
    key = self.request.get('content')
    item = ndb.get(key)
    n = item.content.key() 
    ndb.delete(n)
    item.delete()
    self.redirect('/')


application = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/sign', Guestideabook),
     ('/delete', DelHandler)
], debug=True)

index.html

<!DOCTYPE html>

{% autoescape true %}
<html>
  <head>
    <link type="text/css" rel="stylesheet" href="/bootstrap/css/bootstrap.css" rel="stylesheet">
    <link type="text/css" rel="stylesheet" href="/bootstrap/css/bootstrap-responsive.css" rel="stylesheet">
    <style type="text/css">
      body {
        padding-top: 40px;
        padding-bottom: 40px;
        background-color: #f5f5f5;
      }
      blockquote {
        margin-bottom: 10px;
        border-left-color: #ccc;
      }
      form {
        margin-top: 10px;
      }
      .form-signin input[type="text"] {
        font-size: 16px;
        height: auto;
        margin-bottom: 15px;
        padding: 7px 9px;
      }
      .row {
        margin-left: 0px;
        margin-top: 10px;
        overflow: scroll;
      }
    </style>
  </head>
  <body>
    <div class="navbar navbar-inverse navbar-fixed-top">
      <div class="navbar-inner">
        <div class="container">
          <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="brand" href="#">App Engine Ideabook</a>
          <div class="nav-collapse collapse pull-right">
            <a href="{{ url|safe }}" class="btn">{{ url_linktext }}</a>
          </div>
        </div>
      </div>
    </div>
    <div class="container">

      {% for greeting in greetings %}
      <div class="row">
        {% if greeting.author %}
          <b>{{ greeting.author.nickname() }}</b> wrote:
        {% else %}
         An anonymous person wrote:
        {% endif %}
        <blockquote>{{ greeting.content }} </blockquote>

        <div><form action="/delete" method="post"  >

           <input type="submit" name= "delete" class= "delbtn" value="Delete comment">
            </form></div>
        <blockquote>Date:{{ greeting.date }} </blockquote>
        </div>
      {% endfor %}

      <form action="/sign" method="post">
        <div><textarea name="content" class="input-block-level" rows="3"></textarea></div>
        <div><input type="submit" class="btn btn-large btn-primary" value="Submit Idea"></div>
      </form>


        </div>
  </body>
</html>
{% endautoescape %}

【问题讨论】:

    标签: python google-app-engine python-2.7


    【解决方案1】:

    这是错误的

    item = ndb.get(key)
    

    应该是这样的:

    item = key.get()
    

    看到这个:https://cloud.google.com/appengine/docs/python/ndb/entities#retrieving_entities

    【讨论】:

    • 我试过了,但我得到了这个错误>>> AttributeError: 'str' object has no attribute 'get'
    • 那么您无疑没有密钥,而是密钥的字符串表示形式。看看这个问题的答案:stackoverflow.com/questions/16834797/…
    【解决方案2】:

    你目前有

    key = self.request.get('content')
    item = ndb.get(key)
    

    我假设 key 是实体键。如果是这样,那么你应该这样做

    item = key.get()
    

    文档说 - 要从其键中检索实体,请调用 Key 对象的 get() 方法documentation - Retrieving Entities from Keys

    但是,从您对@Paul Collingwood 的回复看来,您拥有的不是密钥而是 ID,在这种情况下要获取密钥,您应该这样做

    key = Key('Greeting', key)
    

    并删除(当不再需要实体时,您可以使用密钥的 delete() 方法将其从数据存储中删除:documentation - Deleting entities

    key.delete()
    

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2014-03-08
      • 1970-01-01
      • 2013-09-09
      • 2020-02-10
      • 2015-04-25
      • 1970-01-01
      • 2012-05-05
      • 2023-03-22
      相关资源
      最近更新 更多