Python 响应请求后响应请求的日志

Python 响应请求后响应请求的日志,python,django,google-app-engine,Python,Django,Google App Engine,这可能是一个非常不切实际的问题,但我想确保我的代码正在做我认为它正在做的事情 下面是我要做的事情——得到一个请求,做出一个决定,用这个决定回应这个请求,然后记录下来。这个顺序很重要,因为写操作可能很慢,我希望确保在任何写操作发生之前发布响应 以下是示例代码: class ConferenceGreetingHandler(webapp.RequestHandler): def get(self): self.post() def post(self): xml_templat

这可能是一个非常不切实际的问题,但我想确保我的代码正在做我认为它正在做的事情

下面是我要做的事情——得到一个请求,做出一个决定,用这个决定回应这个请求,然后记录下来。这个顺序很重要,因为写操作可能很慢,我希望确保在任何写操作发生之前发布响应

以下是示例代码:

class ConferenceGreetingHandler(webapp.RequestHandler):
def get(self):
    self.post()

def post(self):

    xml_template(self, 'templates/confgreeting.xml')

    new_log = Log()
    new_log.log = 'test'
    new_log.put()
我想我是在登录之前提供了一个响应,这是真的吗?还有,有没有更好的方法?再一次,为超级无趣感到抱歉

编辑:以下是模板:

def xml_template(handler, page, values=None):
    path = os.path.join(os.path.dirname(__file__), page)
    handler.response.headers["Content-Type"] = "text/xml"
    handler.response.out.write(template.render(path, values))

这在很大程度上取决于
xml\u模板的功能。如果它执行了一个
self.response.write(…)
,那么处理程序已经完成了服务响应的部分。处理程序正常完成后,webapp框架将完成其余工作

我不确定你的“更好的方式”问题指的是什么,但有两件事很突出

首先,
logger.warn(“test”)
将写入系统日志,而不是创建一个
log
实例,您以后必须(可能)跟踪并删除该实例

其次,如果要广泛使用
xml\u模板
,请将其作为实例方法。创建自己的
webapp.RequestHandler
子类,将
xml\u模板
放在那里,然后为特定的处理程序创建子类


更新:我忽略了想在写之前得到响应的部分。如果您的写入速度很慢,首先要非常仔细地检查正在写入的实体是否索引过度(索引字段永远不会被查询)。如果这还不足以使性能达到可接受的范围,Nick给出的建议就是解决方法。

无论您做什么,在处理程序代码完成之前,App Engine都不会向用户发送响应。不幸的是,目前没有办法告诉应用程序引擎“立即发送响应,我将不再输出”

您有几个选择:

  • 只需同步放置日志条目。数据存储写入相对于wallclock延迟来说并不昂贵,尤其是在最小化所需索引更新数量的情况下
  • 将任务排队以写入日志数据。如果使用拉队列,则可以从另一个任务或后端获取日志条目并将其批量写入数据存储
  • 一旦有了相关数据,就开始对日志项进行数据存储写入,并使用异步操作,允许您将写入与某些处理重叠

  • 谢谢你,尼克。我假设如果我想在appengine之外使用任务队列方法,芹菜将是一种选择?@Sologoub我对芹菜不太熟悉。我建议使用appengine任务队列;打外线电话只会让事情变慢。谢谢你,尼克。芹菜是一个开源任务队列。与RabbitMQ一起工作。我正在寻找gae的替代品,因为定价让我有点担心。更多的是对未知的恐惧。谢谢你,戴夫。我添加了xml模板代码。它正在执行handler.response.out.write()。我有两种方法——一种是为XML设置标题,另一种是为HTML设置标题。