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个给定)
你可以帮我修改我的代码吗?非常感谢。
答案 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()