GAE - 错误:“此资源不允许POST方法”

时间:2012-10-29 09:58:19

标签: python google-app-engine webapp2

我正在尝试了解如何编辑或更新模型。我尝试了几种有时会出现错误消息的方案:405方法不允许 - 此资源不允许POST方法。以下是我的代码:

Python模型:

import os 
import webapp2
import wsgiref.handlers
from google.appengine.ext import db
from google.appengine.ext.webapp import template

class MessageModel(db.Model):
    content = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)

class Message(webapp2.RequestHandler):

    def get(self):
        doRender(self,'message.htm')

    def post(self):
        m = MessageModel()
        m.content = self.request.get('content')
        m.put()

        self.redirect('/view') 

class View(webapp2.RequestHandler):

    def get(self):

        que = db.Query(MessageModel)
        messageview_list = que.fetch(999)

        doRender(self,
                 'view.htm', 
                 {'messageview_list': messageview_list })


class Edit(webapp2.RequestHandler):

    def get(self):

        doRender(self,'edit.htm')    

    def post(self):

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

        content_query = db.GqlQuery("SELECT * "
                                   "FROM MessageModel "
                                   "ORDER BY date DESC LIMIT 1")

        messageview_list = content_query.fetch(1)
        m = MessageModel()
        m.content = self.request.get(updated_content)
        m.put()

        doRender(self,
                 'edit.htm', 
                 {'messageview_list': messageview_list })


class Main(webapp2.RequestHandler):

    def get(self):
        doRender(self,'index.htm')


def doRender(handler, tname = 'index.htm', values = { }):
    temp = os.path.join(
    os.path.dirname(__file__),
    'templates/' + tname)
    if not os.path.isfile(temp):
    return False

    newval = dict(values)
    newval['path'] = handler.request.path

    outstr = template.render(temp, newval)
    handler.response.out.write(outstr)
    return True




app = webapp2.WSGIApplication([('/', Main),
                   ('/message', Message),
                   ('/view', View),                                                                          
                   ('/edit', Edit)], 
                   debug=True)

HTML表单:

{% for messageview in messageview_list %}

<form method="post" action="/edit">
    <p>
        <textarea name="message" rows="3" cols="60" MAXLENGTH=60>
        {{ messageview.content }}</textarea>
        <br>
        <input type="submit" value="Update"/> 
      </p>
</form>
      {% ifnotequal error None %}
       <p>
       {{ error }}
       </p>
      {% endifnotequal %}
{% endfor %}

1 个答案:

答案 0 :(得分:0)

我假设缩进是由于复制/粘贴,但请确保post()get()函数实际上是在您的类中缩进的。

在您的表单中,您有<textarea name="message" rows="3" cols="60" MAXLENGTH=60>,但在def post() updated_content = self.request.get('content')中,您使用的content正在查找请求中的put()关键字。此外,您的编辑看起来并不像您希望它做的那样。为了编辑实体,过程的基本概要是1.)检索实体(这样做,使用一些参数进行查询); 2.)根据需要修改实体的属性; 3.)def post(self): updated_content = self.request.get('message') content_query = db.GqlQuery("SELECT * " "FROM MessageModel " "ORDER BY date DESC LIMIT 1") # Your query will always return just one entity (due to the LIMIT), # but you can use get() here instead of fetch(1) latest_model = content_query.get() # Update the model's content property latest_model.content = updated_content latest_model.put() # Assuming you want to output that model, you'd output it now doRender(self, 'edit.htm', {'messageview_list': latest_model }) 实体返回数据存储区。

从您的代码中,您看起来正在检索输入数据存储区的最后一个实体,但后来创建了一个新模型而不是编辑该模型(假设这是您想要做的 - 不太确定这是否准确: ))。如果您要修改返回的实体,这应该有效:

{{1}}