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

2024-09-28 22:07:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何编辑或更新模型。我尝试过几个场景,有时会给出错误消息:405 Method Not Allowed-Method POST is Not Allowed for this resource。以下是我的代码:

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表单:

^{pr2}$

Tags: pathimportselfdbgetosdefcontent
1条回答
网友
1楼 · 发布于 2024-09-28 22:07:52

我假设缩进是由于复制/粘贴造成的,但是要确保post()和{}函数在类中实际缩进。在

在您的表单中,您有<textarea name="message" rows="3" cols="60" MAXLENGTH=60>,但是在您的def post()中使用updated_content = self.request.get('content'),它在请求中查找content关键字。另外,你的编辑看起来不像你想要的那样。为了编辑一个实体,这个过程的基本轮廓是: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 })

相关问题 更多 >