我想像下一个结构一样组织我的项目,但是当我尝试测试时我遇到了问题
在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。
你能帮助我吗?
答案 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)