コード例 #1
0
ファイル: wsgi.py プロジェクト: enigma/watson
def _process_field_storage(fields, get=None, post=None, files=None):
    if not get:
        get = MultiDict()
    if not post:
        post = MultiDict()
    if not files:
        files = MultiDict()
    with ignored(Exception):
        for name in fields:
            field = fields[name] if isinstance(name, str) else name
            if isinstance(field, list):
                _process_field_storage(field, get, post, files)
            elif field.filename:
                # An uploaded file, create a new File tuple to resolve the
                # not indexable issue.
                files[field.name] = File(field.file, field.filename,
                                         field.name, field.type,
                                         field.type_options, field.disposition,
                                         field.disposition_options,
                                         field.headers)
            elif field.disposition or field.name not in get:
                post[field.name] = field.value
            else:
                if field.name not in get:
                    get[field.name] = field.value
    return get, post, files
コード例 #2
0
    def __init__(self,
                 method,
                 get=None,
                 post=None,
                 files=None,
                 headers=None,
                 server=None,
                 cookies=None,
                 body=''):
        """Creates a new instance of the Request object.

        Args:
            method: The Http request method
            get: A watson.datastructures.MultiDict containing GET variables
            post: A watson.datastructures.MultiDict containing POST variables
            files: A watson.datastructures.MultiDict containing FieldStorage objects
            headers: A watson.http.headers.HeaderDict containing valid Http headers
            server: A watson.datastructures.MultiDict containing server variables
            cookies: A watson.http.cookies.CookieDict containing watson.http.cookies.TastyMorsel objects
            body: The content of the request
        """
        super(Request, self).__init__(body=body, headers=headers)
        self._method = str(method).upper()
        if self.method not in REQUEST_METHODS:
            raise TypeError('Not a valid Http Request method.')
        self._get = get or MultiDict()
        self._post = post or MultiDict()
        self._files = files or MultiDict()
        self._server = server or MultiDict()
        self._cookies = cookies or CookieDict()
        self.headers = headers or HeaderDict()
コード例 #3
0
 def test_add_key(self):
     d = MultiDict({'test': 'blah', 'something': '2'})
     d['test'] = 'something'
     d['another'] = ['b']
     d['another'] = 'c'
     assert len(d['test']) == 2
     assert len(d.get('test')) == 2
     assert d.get('something') == '2'
コード例 #4
0
 def test_add_key(self):
     d = MultiDict({'test': 'blah', 'something': '2'})
     d['test'] = 'something'
     d['another'] = ['b']
     d['another'] = 'c'
     assert len(d['test']) == 2
     assert len(d.get('test')) == 2
     assert d.get('something') == '2'
コード例 #5
0
def _process_field_storage(fields, get=None, post=None, files=None):
    if not get:
        get = MultiDict()
    if not post:
        post = MultiDict()
    if not files:
        files = MultiDict()
    with ignored(Exception):
        for name in fields:
            field = fields[name] if isinstance(name, str) else name
            if isinstance(field, list):
                _process_field_storage(field, get, post, files)
            elif field.filename:
                files[field.name] = field
            elif field.disposition or field.name not in get:
                post[field.name] = field.value
            else:
                if field.name not in get:
                    get[field.name] = field.value
    return get, post, files
コード例 #6
0
def get_form_vars(environ):
    """Convert environ vars into GET/POST/FILES objects.

    Process all get and post vars from a <form> and return MultiDict of
    each.
    """
    if environ['REQUEST_METHOD'] == 'PUT' and not environ.get('CONTENT_TYPE'):
        environ['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
    field_storage = FieldStorage(fp=environ['wsgi.input'], environ=environ,
                                 keep_blank_values=True)
    get = MultiDict()
    for name, value in parse_qsl(environ.get('QUERY_STRING')):
        get[name] = value
    return _process_field_storage(field_storage, get=get)
コード例 #7
0
ファイル: types.py プロジェクト: watsonpy/watson-form
    def data(self, data):
        """Sets the data for the form.

        Iterates through all the fields on the form and injects the value.

        Args:
            data (dict|watson.http.messages.Request): A dict of key/value pairs to populate the form with.
        """
        self.invalidate()
        if hasattr(data, 'post'):
            raw_data = MultiDict()
            raw_data.update(data.post.items())
            try:
                raw_data.update(data.json_body)
            except:
                pass
            for key, value in data.files.items():
                # need to do this rather than .update due to File objects
                # being named tuples
                raw_data[key] = value
        else:
            raw_data = data
        self._set_data_on_fields(raw_data)
コード例 #8
0
def split_headers_server_vars(environ):
    """Splits the environ into headers and server pairs.
    """
    headers = HeaderDict()
    server = MultiDict()
    cookies = CookieDict()
    for key in environ:
        if is_header(key):
            headers.add(http_header(key), environ[key])
            if key == 'HTTP_COOKIE':
                cookies = CookieDict(environ[key])
                cookies.modified = False
        else:
            server[key] = environ[key]
    return headers, server, cookies
コード例 #9
0
    def data(self, data):
        """Sets the data for the form.

        Iterates through all the fields on the form and injects the value.

        Args:
            dict|watson.http.messages.Request data: A dict of key/value pairs to populate the form with.
        """
        self.invalidate()
        if hasattr(data, 'post'):
            raw_data = MultiDict()
            for key, value in data.post.items():
                raw_data[key] = value
            for key, value in data.files.items():
                raw_data[key] = value
        else:
            raw_data = data
        self._set_data_on_fields(raw_data)
コード例 #10
0
        def data(self, data):
            """Sets the data for the form.

            Override the existing set data method and inject the csrf
            token into the form.
            """
            token_name = '{0}_csrf_token'.format(self.name)
            if hasattr(data, 'post'):
                raw_data = MultiDict()
                for key, value in data.files.items():
                    raw_data[key] = value
                for key, value in data.post.items():
                    if key.endswith('_csrf_token'):
                        raw_data['csrf_token'] = value
                    else:
                        raw_data[key] = value
            else:
                if token_name in data:
                    data['csrf_token'] = data[token_name]
                    del data[token_name]
                raw_data = data
            self._set_data_on_fields(raw_data)
コード例 #11
0
 def test_add_key(self):
     d = MultiDict({'test': 'blah', 'something': '2'})
     d['test'] = 'something'
     d['another'] = ['b']
     d['another'] = 'c'
     assert d['test'].__len__() == 2
コード例 #12
0
 def test_set_replace(self):
     d = MultiDict({'test': 'blah'})
     assert d['test'] == 'blah'
     d.set('test', 'testing', replace=True)
     assert d['test'] == 'testing'
コード例 #13
0
 def test_update(self):
     d = MultiDict()
     d.update({'test': 'test'})
     assert 'test' in d
コード例 #14
0
 def test_get_value(self):
     d = MultiDict()
     d['list'] = []
     assert d.get('empty') is None
     assert d.get('list') is not None
コード例 #15
0
 def test_get_value(self):
     d = MultiDict()
     d['list'] = []
     assert d.get('empty') is None
     assert d.get('list') is not None
コード例 #16
0
 def test_update(self):
     d = MultiDict()
     d.update({'test': 'test'})
     assert 'test' in d
コード例 #17
0
 def test_set_replace(self):
     d = MultiDict({'test': 'blah'})
     assert d['test'] == 'blah'
     d.set('test', 'testing', replace=True)
     assert d['test'] == 'testing'