【问题标题】:How to simulate POST arguments in python如何在python中模拟POST参数
【发布时间】:2010-10-19 08:40:45
【问题描述】:

我正在尝试将一些数据模拟到数据存储中以模拟 POST。

我正在寻找一种将命名参数发布但作为一个参数的方法。所以我可以使用与普通 POST 相同的方法。

我要调用的方法get params有两种方式。

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 请求处理程序混淆。

多亏了 pthulin,我快到了。剩下的就是如何模拟具有相同密钥的数据。因为使用 dict 会覆盖其他同名的键。有时在 HTML 表单中,一个帖子可以包含多个值,用于我们使用self.request.get_all('key') 获得的同一个键。那么如何创建一个支持具有相同键的多个键=值的字典(或相同的东西)。

..弗雷德里克

【问题讨论】:

  • 你用的是什么框架?如果您构建一些通用功能,您的处理程序和加载代码都会调用,而不是试图通过您的处理程序提供所有内容,那么您的既定目标会更有意义。
  • 更新您的问题将包含所有附加信息。请不要将 cmets 添加到您拥有的问题中。请更新您的问题。请修复标签以包含 [webapp],以便每个人都知道您在做什么。

标签: python google-app-engine web-applications


【解决方案1】:

我认为你想要做的是准备一个 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方法提取参数。

【讨论】:

  • 谢谢,这就是我要找的。但唯一我想不通的。我更新了问题。
  • 好的,我用如何发送多个帖子参数的解决方案更新了我的回复
  • 谢谢。效果很好。 urlencode([('test',1), ('test', 2)]) 似乎也可以正常工作!
【解决方案2】:

当然,它们是代表 http 请求的请求对象。它通常应该包含典型的 http 请求信息,如方法、uri、消息等。

要找出 self.request 是什么类型,您可以在没有文档的情况下进行自省。如果 self.request 是一个类的实例化,那么你可以通过

获取类名
print self.request.__class__

[编辑]:

信息在谷歌应用引擎文档中提供

【讨论】:

  • @Nick Johnson:@fredrik:问题提到了应用引擎源。我猜到了。尽管使用了 print 语句,但 fredrik 应该能够找到类名并通过 greping 源找到更多信息
  • 是的网络应用程序。在源代码中找到类名并查看它。
  • 这不是 webapp 处理程序。要么你做错了,要么你使用了不同的框架。
  • @nick,更新了问题。它是 webapp,但 PostHandler 只是一个坏名字。这是一个由 webapp 请求处理程序调用的方法
【解决方案3】:

是的,可以这样做。这是 webapp 响应处理程序。方法是使用 response.argument() 返回数据参数列表。然后迭代并获取(每个)。为清楚起见,我将展示如何处理提前知道的命名参数以及您所要求的多个任意参数:

from google.appengine.ext import webapp

class postHandler(webapp.RequestHandler):
def post(self):

    # Handle arguments one at a time
    var1 = self.request.get('var1')

    # or get them all and build a dict:
    args = self.request.arguments()
    arg_dict = {}
    for arg in args:
        arg_dict.update(arg: self.request.get(arg))

这里有一些文档:http://code.google.com/appengine/docs/python/tools/webapp/requestclass.html#Request_get_all

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2014-10-29
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多