在这个python代码(谷歌应用程序引擎)中产生“405 Method Not Allowed”的原因是什么?

时间:2012-04-27 16:27:01

标签: python html google-app-engine

我是一个蟒蛇新手,我正在尝试按照我班上早些时候教过的内容逐步构建应用程序,但我得到的是“405 Method Not Allowed”错误。

教授在这里做了什么: enter image description here

我在这里做了什么:

enter image description here

有人能指出我在下面的代码中是什么导致此错误“405 Method Not Allowed”?我看不出我做了什么和教授教的内容之间的区别。 缩进也可以(这里是main.py文件https://docs.google.com/open?id=0B8TXLR_e14aCVDFfdlpYSU9DNDg)。

提前感谢您的帮助!

这是我的代码:

form= """
  <html>
  <head>
    <title>Unit 2 Rot 13</title>
  </head>

  <body>
    <h2>Enter some text to ROT13:</h2>
    <form method="post" action="/rot13">
      <textarea name="text"
                style="height: 100px; width: 400px;"></textarea>
      <br>
      <input type="submit">
    </form>
  </body>

  </html> """

class MainHandler(webapp2.RequestHandler):
    def get(self):
        self.response.out.write(form)

class Rot13Handler(webapp2.RequestHandler):
    def post(self):
        text = self.request.get("text")
        self.response.out.write(text)

app = webapp2.WSGIApplication([('/', MainHandler), ('/rot13', Rot13Handler)],
                          debug=True)

7 个答案:

答案 0 :(得分:9)

我只是在Udacity的在线课程后尝试使用Python,并遇到类似的问题,AppEngine无法找到post方法。

最后,事实证明根本原因是 INDENTION

我使用Notepad ++作为小项目的编辑器,它只是无法工作,继续抛出405错误。然后我将代码复制并粘贴到安装了Python插件的Netbean IDE中,IDE显示错误的缩进使得POST方法成为GET方法的内部方法,这在Notepad ++中找不到,尽管它看起来像是缩进的处理得很好。

答案 1 :(得分:4)

代码是正确的,工作正常。你需要到别处寻找这个405错误的解释。

修改

您是否发布了实际代码?单击“提交”时,下面的代码将为您提供405 Method not Allowed错误。它有一个微妙的错误......:)

import webapp2

form= """
  <html>
  <head>
    <title>Unit 2 Rot 13</title>
  </head>

  <body>
    <h2>Enter some text to ROT13:</h2>
    <form method="post" action="/rot13">
      <textarea name="text"
                style="height: 100px; width: 400px;"></textarea>
      <br>
      <input type="submit">
    </form>
  </body>

  </html> """

class MainHandler(webapp2.RequestHandler):
    def get(self):
        self.response.out.write(form)

class Rot13Handler(webapp2.RequestHandler):
    # Error here: mistyped get instead of post :)
    def get(self):
        text = self.request.get("text")
        self.response.out.write(text)


app = webapp2.WSGIApplication([('/', MainHandler),
                               ('/rot13', Rot13Handler)],
                              debug=True)

如果您的路由输入错误,也会发生同样的情况,如:

app = webapp2.WSGIApplication([('/', MainHandler),
                               ('/rot13', MainHandler)],
                              debug=True)

编辑(谢谢,@Nick Johnson)

如果以上都不起作用,请考虑从头开始并检查您的GAE设置。

  1. 您是否在app.yaml模块旁边有一个有效的main.py文件?
  2. 您是否可以在标准Google AppEngine安装中运行留言板演示应用?
  3. 如果没有,请发布错误消息(如果有)以及您正在运行它的系统的详细信息。
  4. 如果您能够运行留言簿,可以尝试通过编辑该应用程序来重建您的应用程序吗?我发现这在过去对我有用。

答案 2 :(得分:2)

有同样的问题。问题再次是缩进。定义时:

def post(self):

如果我使用'tab'进行缩进则无法正常工作。当我使用空格时,它做到了。错误日志没有显示。为了避免这样的问题,你可以使用python IDE,比如Wing IDE。

答案 3 :(得分:1)

我在Notepad ++中遇到了同样的问题。我用Python IDLE改变的只是用一个标签替换一些空格并且它运行良好:)

答案 4 :(得分:0)

使用Notepad ++遇到同样的问题。在我读到这篇文章之前,我花了好几天才弄清楚出了什么问题。切换到使用Python IDLE。奇迹般有效。我会回应@Aris并说使用'传统'Python IDE是最好的方法。

答案 5 :(得分:0)

我的代码遇到了同样的问题,当我重新安排处理程序的顺序时,这个问题已得到修复。通过几个不同的SO答案检查Handler定义,缩进中的错误,最后通过查看处理程序的顺序修复它。

答案 6 :(得分:0)

以我为例,当我尝试拨打电话时:我得到405方法不允许

@app.route("/test")
def test():
    print('inside test')
    if request.method == 'POST':
    # some code
    res = json.dumps({ 'success': True, 'message': db_res }), 200, headers
    return res

我错过的地方:

methods = ['POST']

@app.route("/test" , methods=['POST'])

然后对我有用