Python webapp2项目结构配置

时间:2017-05-08 16:53:50

标签: python python-2.7 webapp2 google-app-engine-python

我想像下一个结构一样组织我的项目,但是当我尝试测试时我遇到了问题

enter image description here

在handlers文件夹中的

我有一个名为:Base.py的文件,里面有一个类:

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

 class BaseHandler(webapp2.RequestHandler):
       property = 0

在相同的文件夹处理程序中我有另一个名为EchoHandler.py的文件和一个里面的类

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

我的main.py文件看起来像

 import webapp2
 import config

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

我的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

问题

当我向http://localhost:8080/x/v1/echo发送POST请求时发送此数据:

  {
    "echo": "Test"
  }

我收到回复" 200 OK"但我没有得到任何json响应,没有写入日志

如果我改变了这个" http://localhost:8080/x/v1/echo"到" http://localhost:8080/x/v1/echoasdfa"我也收到200 ok。

你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

这是一个非常古老的问题,但无论如何我都会回答这个问题。在返回之前,请确保将数据写入处理程序中的Response对象。您没有提供self.json_data()方法的代码,但我假设即使您要返回它,也不会将json数据写入Response对象。此外,这可能只是问题中的拼写错误,但看起来你的return self.json_data(get_success_reponse(echo))行没有缩进。它应该与post()代码的其余部分处于相同的缩进级别。

无论如何,试试这个:

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)

您需要将数据写入Response以将该数据发送到客户端。在您写入响应对象后,您不需要 来返回响应对象,但我还是喜欢这样做,因为我觉得它看起来更清晰。

此外,您的路线看起来搞砸了。尝试将main.py更改为:

 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)

或者,我这样做的方法是将处理程序实际导入main.py:

 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)