405不允许的方法此资源不允许使用方法GET(AppEngine,Python)

时间:2017-07-05 21:53:07

标签: python google-app-engine

注意:我认为我的代码中发现了什么错误,我没有安装请求模块。我现在正在调查此事。

我用这个引擎应用程序将头撞在墙上。尝试对类似问题给出的补救措施无济于事。也许有人能发现问题所在?

这就是我正在做的事情:

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方法不允许此方法不允许GET方法)。浏览器显示此网址:

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的云端。

提前感谢任何提示!

在第1条评论之后添加:

a)正确复制缩进:def get(self)以及后面的内容现在正确缩进。

b)添加了app.yaml的内容

c)当我从html页面调用它来查找产品时,get函数运行良好,这里是带有要求所需信息的表单的代码片段:

 <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})

1 个答案:

答案 0 :(得分: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发送请求。希望你能看到正在发生的事情。