2017-07-05 19 views
0

注:私は自分のコードで何が間違っていると思っています。私は今これを調べている。405メソッドが許可されていませんこのリソース(AppEngine、Python)でメソッドGETが許可されていません

私はこの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メソッドが許可されていませんこのリソースに対してメソッドGETは許可されていません)。ブラウザはこのURLを示しています

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要求を送信し、ハンドラーでpostのgetを変更するすべての組み合わせを試しました。ブラウザからログアウトするか、別のブラウザを使用するたびにエラーが発生します。

は、ここに私の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で日食のネオンにPyDevはを使用して書かれています。デバッグしたらGoogleのクラウドにアップロードできます。

ご協力いただきありがとうございます!

1STコメントの後に追加:

a)にコピーされたインデントを正しくます:def(自己)を取得し、次は正しくなりましインデントされています。

:私は製品を見つけるためにhtmlページからそれを呼び出すときに関数getがうまく機能

B))はapp.yamlを

Cの内容を追加しました、こちらのフォームでのコードスニペットは、必要な情報をお願いします

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

あなたの 'app.yaml'ファイルを見る必要があります。 –

+0

コードに実際にインデントされていますか?もし、 'def get()'が更にインデントされる必要があるなら、 'class DisplayProduct()' –

+0

あなたのクラスを表示してください。BaseHandler – Sriram

答えて

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にリクエストを送信します。うまくいけば、あなたは何が起こっているのを見るでしょう。

+0

ハイGAEfan:あなたが提案したロギングを試しました。しかし、あなたは私にアイデアを教えてくれました。プログラムでPOSTリクエストを生成するのではなく、url_str = '/ products_display?find_id_txt =' + prod_id_txtとself.redirect(url_str)のようなGETリクエストを作成します。私は、display_productに2つのメソッドを持っています。今すぐ動作します。これにより、私がリクエストモジュールをインストールしていないことがわかりました。私はそれを今見ているが、少なくともアプリケーションは動作する。 – kxtronic

+0

はい、これはトラブルシューティングの次のステップでした。 – GAEfan

+0

要求モジュールをインストールすることは、必要な他のパッケージ(chardet、idfaなど)に対してヒットします。新しく格納された製品を表示するページに投稿を送信する最も単純な方法は何でしょうか?前述したように、私はgetでトリックを行うことができますが、私はfind_productフォームから同じ製品の表示ページを別の場所に呼び出し、フォーム送信ボタンは投稿を送信します。可能な限り、同じハンドラで同じgetおよびget関数を使用することによってコードの重複を避けたいと思います。 – kxtronic

関連する問題