Как смоделировать аргументы POST в Python - PullRequest
1 голос
/ 19 октября 2010

Я пытаюсь смоделировать некоторые данные в хранилище данных для эмуляции POST.

То, что я ищу, это способ публикации именованных аргументов, но в качестве одного аргумента.Так что я могу использовать тот же метод, что и обычный POST.

Метод, который я хочу вызвать, получить параметры двумя способами.

def HandlePost(params):
    params.get('name')
    params.get_all('collection')

class SavePartHandler(webapp.RequestHandler):
    def post(self):
        HandlePost(self.request)

Я пытаюсь выяснить, к какому типу относится self.request, но не могу найти его нигде в приложениях.исходный код.

Моя цель состоит в том, чтобы смоделировать несколько POST для заполнения хранилища данных методами, которые будут использовать пользователи.

РЕДАКТИРОВАТЬ:

Или в любом случаеизменить поведение dict, чтобы он мог использовать метод get_all?

РЕДАКТИРОВАТЬ 2:

Я использую appengins webapp.

Из любопытства есть способ вызвать фиктивный webapp.RequestHandler и заполнитьэто с аргументами?Я просматриваю исходный код, чтобы увидеть, как это делается и сделал новый экземпляр, но не могу найти, как его заполнить.

РЕДАКТИРОВАТЬ 3:

Обновленное имя метода, так что оно не перепутано с обработчиками запросов webapp.

Благодаря pthulin я почти на месте.Осталось только симулировать данные с одинаковым ключом.Поскольку использование dict переопределит другие ключи с таким же именем.Иногда в HTML-формах сообщение может содержать несколько значений для одного и того же ключа, который мы получаем с self.request.get_all('key').Так, как создать dict (или что-то равное), который поддерживает множественный ключ = значение с тем же ключом.

.. Фредрик

Ответы [ 3 ]

1 голос
/ 19 октября 2010

Я думаю, вам нужно подготовить объект запроса веб-приложения, а затем вызвать метод 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.

1 голос
/ 19 октября 2010

Наверняка они являются объектами запроса, представляющими запрос http. Обычно он должен содержать типичную информацию http-запроса, такую ​​как method, uri, message и т. Д.

Чтобы узнать, к какому типу относится self.request, вы можете сделать самоанализ без документа. если self.request является экземпляром класса, тогда вы можете получить имя класса через

print self.request.__class__

[Изменить]:

Информация предоставлена ​​в документе Google App Engine

0 голосов
/ 19 октября 2010

Да, это можно сделать.Вот обработчик ответа 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...