2017-05-08 1 views
0

Ich mag würde mein Projekt, wie die nächste Struktur zu organisieren, aber ich habe ein Problem, wenn ich versuche, es zu testenPython webapp2 Projektstruktur Konfiguration

enter image description here

in dem Handler Ordnern Ich habe eine Datei mit dem Namen: Base.py und eine Klasse innen:

def get_success_reponse(**kwargs): 
    kwargs.update(
     dict(
     status="SUCCESS", 
     ) 
    ) 
    return kwargs 

class BaseHandler(webapp2.RequestHandler): 
     property = 0 

in den gleichen Ordner Handler habe ich eine andere Datei mit dem Namen: EchoHandler.py und eine Klasse in

import Base 

class EchoHandler(Base.BaseHandler): 
    def post(self): 
     logger.info("test")  
     data = json.loads(self.request.body) 
     echo = data.get("echo") 
    return self.json_data(get_success_reponse(echo)) 

Meine main.py Datei sieht aus wie

import webapp2 
import config 

app = webapp2.WSGIApplication([ 
     webapp2.Route('/x/v1/echo', handler='handlers.EchoHandler') 
], debug=True, config=config.WEBAPP2CONFIG) 

Mein app.yaml

runtime: python27 
api_version: 1 
threadsafe: false 

handlers: 
- url: /x/.* 
    script: main.py 

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

Problem

Wenn ich eine POST-Anforderung an http://localhost:8080/x/v1/echo sendind diese Daten:

{ 
    "echo": "Test" 
    } 

Ich erhalte eine Antwort „200 OK“ aber ich bekomme keine Antwort json, wird kein Protokoll

geschrieben Wenn ich diese „http://localhost:8080/x/v1/echo“ auf „http://localhost:8080/x/v1/echoasdfa“ Ich erhalte 200 auch ok.

Können Sie mir helfen?

Antwort

0

Das ist eine ziemlich alte Frage, aber ich werde sie trotzdem beantworten. Stellen Sie sicher, dass Sie die Daten in das Antwortobjekt in Ihrem Handler schreiben, bevor Sie zurückkehren. Sie haben den Code für die self.json_data()-Methode nicht angegeben, aber ich nehme an, dass Sie die JSON-Daten nicht in das Response-Objekt schreiben, obwohl Sie es zurückgeben. Dies kann auch nur ein Tippfehler in der Frage sein, aber es sieht so aus, als ob Ihre Zeile return self.json_data(get_success_reponse(echo)) nicht eingerückt ist. Es sollte auf der gleichen Einrückungsebene wie der Rest des post() - Codes sein.

Auf jeden Fall versuchen Sie dies:

import Base 
import json 

class EchoHandler(Base.BaseHandler): 
    def post(self): 
     logger.info("test")  
     data = json.loads(self.request.body) 
     echo = data.get("echo") 

     # get the dict you want to convert to JSON 
     echo_dict = get_success_response(echo) 

     # convert it to a JSON string 
     echo_json = json.dumps(echo_dict) 

     # set the content type of the Response to JSON 
     self.response.content_type = 'application/json' 

     # write the JSON to the Response body and return the Response 
     return self.response.write(echo_json) 

Sie benötigen Daten an die Antwort zu schreiben, um diese Daten an den Client zu senden. Sie brauchen nicht brauchen, um das Antwortobjekt zurückzugeben, nachdem Sie darauf schreiben, aber ich mag es trotzdem, weil ich denke, dass es klarer aussieht.

Auch Ihre Route sieht durcheinander. Versuchen Sie, Ihre main.py zu diesem Wechsel:

import webapp2 
import config 

# changed the lazy import line (handler='handlers.EchoHandler.EchoHandler') 
app = webapp2.WSGIApplication([ 
     webapp2.Route('/x/v1/echo', handler='handlers.EchoHandler.EchoHandler') 
], debug=True, config=config.WEBAPP2CONFIG) 

oder, wie ich es tun würde, ist es durch tatsächlich den Handler in das main.py importieren:

import webapp2 
import config 
from handlers import EchoHandler 

# note: no quotes around EchoHandler.EchoHandler 
app = webapp2.WSGIApplication([ 
     webapp2.Route('/x/v1/echo', handler=EchoHandler.EchoHandler) 
], debug=True, config=config.WEBAPP2CONFIG)