如何在python中处理javascript回调返回数据

时间:2015-04-02 10:55:44

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

var req = new XMLHttpRequest();

req.open('GET','/ Search?'+ query,async);
if(async){

   req.onreadystatechange = function() {
         if(req.readyState == 4 && req.status == 200) {
                var response = null;
                try {
                      response = JSON.parse(req.responseText);

                    } catch (e) {
                                 response = req.responseText;
                                 }
                     callback(response);

这个回调函数将值返回给我的python代码(我使用GAE和python 2.7)。

class KeywordSearchRPCHandler(webapp2.RequestHandler):

def __init__(self):
    webapp2.RequestHandler.__init__(self)
    self.methods = RPCMethods()
def get(self):
    func = None
    action = self.request.get('action')
    if action:
        if action[0] == '_':
            self.error(403) # access denied
            return
        else:
            func = getattr(self.methods, action, None)
    if not func:
        self.error(404) # file not found
        return

    else :
        args = ()
        while True:
            key = 'arg%d' % len(args)
            val = self.request.get(key)
            #print val
            if val:
                args = (json.loads(val))
            else:
                break
        result = func(*args)

        self.response.out.write(json.dumps(result))

这是处理回调函数的代码。

我收到错误 init ()只需1个参数(3个给定)

你可以帮我修改我的代码吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

以下是文档:Docs

webapp2.RequestHandler.__init__(request=None, response=None)是签名。

所以将请求和响应作为参数添加到init中,你应该没问题。

def __init__ (self)更改为def __init__(self, request=None, response=None)。这将修复错误。

你可能想要正确地致电super,而不是在这里打电话给__init__webapp2.RequestHandler.__init__(self)

这应该很可能是super(KeywordSearchRPCHandler, self).__init__(request, response)

答案 1 :(得分:0)

init处理程序:

class RPCHandler(webapp2.RequestHandler):
    """ Allows the functions defined in the RPCMethods class to be RPCed."""

    def __init__(self, request, response):

        super(RPCHandler, self).__init__(request, response)
        self.methods = RPCMethods()

但我不明白你的GET中的json.loads(val),因为你发送的是查询字符串而不是json请求。

以下是处理json帖子的示例帖子:

def post(self):

    data = self.request.body
    args = loads(data)

    if 'action' not in args:
        self.error(405)  # access denied
        return

    func = args['action']

    if func[0] == '_':
        self.error(403)  # access denied
        return

    func = getattr(self.methods, func, None)
    if not func:
        self.error(404)  # file not found
        return

    # action handler aanroepen
    result = func(args)
    self.response.out.write(json.dumps(result))

如果您使用带有查询字符串的GET,webapp2将处理该请求。来自文档:

# An iterable with all items in the MultiDict:
# [('check', 'a'), ('check', 'b'), ('name', 'Bob')]
self.request.GET.items()