我正在尝试将一些数据模拟到数据存储中以模拟POST。
我正在寻找一种发布命名参数但作为一个参数的方法。因此,我可以使用与普通POST相同的方法。
我要调用的方法有两种获取参数的方法。
def HandlePost(params):
params.get('name')
params.get_all('collection')
class SavePartHandler(webapp.RequestHandler):
def post(self):
HandlePost(self.request)
我试图找出
self.request
是什么类型,但是在appengines源代码的任何地方都找不到它。我的目标是模拟多个POST,以按照用户使用的方法填充数据存储区。
编辑:
还是要改变
dict
的行为,以便可以使用get_all
方法?编辑2:
我正在使用appengins webapp。
出于好奇,是否有一种方法可以调用虚拟webapp.RequestHandler并为其填充参数?我正在浏览源代码,以了解它是如何完成的并为其创建了新实例,但找不到如何填充它。
编辑3:
更新了方法名称,因此它不会与webapp请求处理程序混淆。
多亏了ththulin,我快到了。剩下的就是如何模拟具有相同密钥的数据。由于使用字典将覆盖具有相同名称的其他键。有时,在HTML表单中,帖子可以包含我们通过
self.request.get_all('key')
获得的同一个键的多个值。因此,如何创建支持相同键的多个key = value的dict(或相等值)。..弗雷德里克
最佳答案
我认为您想要做的是准备一个webapp Request对象,然后调用处理程序的post方法:
from google.appengine.ext.webapp import Request
from google.appengine.ext.webapp import Response
from StringIO import StringIO
form = 'msg=hello'
handler.response = Response()
handler.request = Request({
'REQUEST_METHOD': 'POST',
'PATH_INFO': '/',
'wsgi.input': StringIO(form),
'CONTENT_LENGTH': len(form),
'SERVER_NAME': 'hi',
'SERVER_PORT': '80',
'wsgi.url_scheme': 'http',
})
handler.post()
提示:在这种情况下,上面的'msg = hello'可以正常工作,但是要传递多个POST参数,您需要创建一个URL编码的字符串:
>>> form = {
... 'first_name': 'Per',
... 'last_name': 'Thulin',
... }
>>> from urllib import urlencode
>>> urlencode(form)
'first_name=Per&last_name=Thulin'
如果您想传递多个具有相同名称的POST参数,我认为您需要自己做一些url编码工作。例如:
>>> from urllib import urlencode
>>> form_inputs = [
... {'someparam': 'aaa'},
... {'someparam': 'bbb'},
... {'someparam': 'ccc'},
... ]
>>> '&'.join([urlencode(d) for d in form_inputs])
'someparam=aaa&someparam=bbb&someparam=ccc'
然后,在RequestHandler中,可以使用Request.get_all方法提取参数。
http://code.google.com/appengine/docs/python/tools/webapp/requestclass.html
http://code.google.com/appengine/docs/python/tools/webapp/requestclass.html#Request_get_all
关于python - 如何在python中模拟POST参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3966585/