【问题标题】:405 Method Not Allowed The method GET is not allowed for this resource (AppEngine, Python)405 Method Not Allowed 该资源不允许使用 GET 方法(AppEngine、Python)
【发布时间】:2023-03-12 13:20:01
【问题描述】:

注意:我想我发现我的代码有什么问题,我没有安装请求模块。我正在调查此事。

我正在用这个 appengine 应用程序撞墙。尝试了针对类似问题提供的补救措施,但无济于事。也许有人可以发现问题所在?

这就是我正在做的事情:

1) 我根据用户的输入在应用中创建产品。写入 ndb 后,我会调用一个页面来显示最近创建的产品:

import requests
....
r = requests.post('products_display', data = {'find_id_txt':prod_id_txt})

请求通过:

application = webapp2.WSGIApplication([
    ('/products_add', AddProduct),      
    ('/products_display', DisplayProduct),    
    ...
], config = session_params, debug = True) 

然后它到达正确的处理程序,我得到 405 错误(405 Method Not Allowed The method GET is not allowed for this resource)。浏览器显示此网址:

http://localhost:8080/products_display

这是处理程序的代码(目前我只显示一个页面来告诉您是否找到了产品)。

class DisplayProduct(BaseHandler):
    # Finds a product on exact Prod_ID property
    def get(self):
        user = usermgmt.get_user(self)
        logout_url = users.create_logout_url(self.request.uri)
        access = usermgmt.get_auth("Products")  
        client_name = usermgmt.get_client_subdomain()
        search_key = self.request.get('find_id_txt')
        find_query = models.Product.query(models.Product.prod_id == search_key, ancestor = get_products_key()).get()
        # Check if query returned a value
        if find_query:      
            template_values = {
                'client_name': client_name,              
                'user': user,
                'logout_url': logout_url,
                'alert_message': "Product1: " + search_key + " was found."
            }
            template = JINJA_ENVIRONMENT.get_template('alert-blue.html')
            self.response.write(template.render(template_values))               
        else:
            template_values = {
                'client_name': client_name,              
                'user': user,
                'logout_url': logout_url,
                'alert_message': "Product1: " + search_key + " could not be found."
            }
            template = JINJA_ENVIRONMENT.get_template('alert-yellow.html')
            self.response.write(template.render(template_values))            

我尝试了所有可能的组合,即发送一个 get,然后是一个 post 请求并在处理程序上更改 get for post。每次我退出浏览器或使用另一个浏览器时,我仍然会收到错误。

这是我的 app.yaml 文件的内容:

#application: fpp-system
#version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:

- url: /categories.*
  script: categories.application
  login: required

- url: /calendar.*
  script: calendars.application
  login: required

- url: /images
  static_dir: images

- url: /products.*
  script: products.application
  login: required

- url: /signin.*
  script: signin.application

- url: /stylesheets
  static_dir: stylesheets

- url: /test.*
  script: test.application

- url: /units.*
  script: units.application
  login: required 

- url: /.*
  script: main.application

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

代码是在 Linux Ubuntu 16.04 上的 eclipse neon 上使用 pydev 编写的。调试完成后,我可以将其上传到 Google 的云端。

提前感谢您的任何提示!

在第一条评论之后添加:

a) 正确复制缩进:def get(self) 和下面的缩进现在正确。

b) 添加 app.yaml 的内容

c) 当我从 html 页面调用 get 函数来查找产品时,get 函数运行良好,这里是代码 sn-p 以及用于询问所需信息的表单:

 <form action="/products_display" method="post">
   <div><input value="" name="find_id_txt" size="15"></div>
   <div><input type="submit" value="Find"></div>
 </form><br>

但是当我以编程方式调用它时会出现 405 错误:

r = requests.post('products_display', data = {'find_id_txt':prod_id_txt})

【问题讨论】:

  • 我们需要查看您的app.yaml 文件。
  • 这是您在代码中的实际缩进吗?如果是这样,def get() 需要进一步缩进 vs class DisplayProduct()
  • 显示你的类 BaseHandler

标签: python google-app-engine


【解决方案1】:

试试这个来解决问题:

import logging

class DisplayProduct(BaseHandler):
    def get:
        logging.info("this is a GET")

    def post:
        logging.info("this is a POST")

然后,发送您当前的 POST。接下来,发送请求至:http://localhost:8080/products_display?find_id_txt=test。希望你能看到发生了什么。

【讨论】:

  • 您好 GAEfan:我尝试了您建议的日志记录,但无法正常工作。但是您给了我一个想法:我不是以编程方式生成 POST 请求,而是创建一个 GET 请求,例如:url_str = '/products_display?find_id_txt=' + prod_id_txt 然后 self.redirect(url_str)。我在 display_product 中有两种方法一个帖子和一个获取。现在可以了。这让我发现我没有安装 requests 模块。我现在正在研究,但至少该应用程序有效。
  • 是的,这是故障排除的下一步。
  • 安装请求模块会碰到其他需要的包:chardet、idfa 等。将帖子发送到显示新存储产品的页面的最简单方法是什么?如前所述,我可以使用 get 来解决问题,但我也可以从其他地方的 find_product 表单调用相同的产品显示页面,并且表单提交按钮会发送一个帖子。我希望通过在同一个处理程序中拥有相同的 get 和 get 函数来尽可能避免代码重复。
猜你喜欢
  • 2012-11-01
  • 2021-02-01
  • 2014-08-31
  • 2017-07-05
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多