Skip to content

Conversation

@signalw
Copy link

@signalw signalw commented Aug 12, 2018

I see the point of having extra_orig is when the user passes in extra arguments that contain original request attributes, we temporarily store them in it. We set the values passed in by user when entering the context and change it back to original values when exiting the context.

But actually, I looked into the latest stable version of bottle (0.12.13), the properties of bottle.request are all read only, meaning that we can't actually overwrite them. E.g.:

with boddle(user='hi', forms='hey', files='hello'):
  # bottle.request.user == hi
  # bottle.request.forms != 'hey', it's still the default property!
  # bottle.request.files != 'hello', it's still the default property!

In our boddle.py we do this to set extra arguments:

setattr(bottle.request, k, v)

This is how bottle handles extra properties:

def __setattr__(self, name, value):
    if name == 'environ': return object.__setattr__(self, name, value)
    self.environ['bottle.request.ext.%s'%name] = value
def __getattr__(self, name):
    ''' Search in self.environ for additional user defined attributes. '''
    try:
        var = self.environ['bottle.request.ext.%s'%name]
        return var.__get__(self) if hasattr(var, '__get__') else var
    except KeyError:
        raise AttributeError('Attribute %r not defined.' % name)

First, if a user passes in environ='test' as extra argument, it will blow this whole bottle thing up.
Then, bottle.request.user works because the extra property is stored as bottle.request.ext.user in the self.environ dictionary and upon retrieving, there's no user property in request, so we go to the dictionary to get it as an extra property. And files and forms are stored as bottle.request.ext.files and bottle.request.ext.forms in there. That's how bottle prevents its own properties from being overwritten.

I don't know if anything else we can do to make it work... this change only fixes the "environ" keyword issue. Not sure what we should do about the other issue. And since original properties can't be overwritten, I removed extra_orig.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant