[Web-SIG] WSGI deployment part 2: factory API
Phillip J. Eby
pje at telecommunity.com
Mon Jul 25 16:40:49 CEST 2005
At 10:26 PM 7/24/2005 -0500, Ian Bicking wrote:
>Phillip J. Eby wrote:
>>>Another option is we pass in a single dictionary that represents the
>>>entire configuration. This leaves room to add more arguments later,
>>>where if we use keyword arguments for configuration then there's really
>>>no room at all (the entire signature of the factory is taken up by
>>>application-specific configuration).
>>
>>YAGNI; We don't have any place for this theoretical extra configuration
>>to come from, and no use cases that can't be met by just adding it to the
>>configuration. Early error trapping is important, so I think it's better
>>to let factories use normal Python argument validation to have required
>>arguments, optional values, and to reject unrecognized arguments.
>
>I think in practice I'll always take **kw, because I otherwise I'd have to
>enumerate all the configuration all the middleware takes, and that's
>impractical. I suppose I could later assemble the middleware, determine
>what configuration the actual set of middleware+application takes, then
>check for extras. But I doubt I will. And even if I do, it's incidental
>-- I'm quite sure I won't use using the function signature for parameter
>checking.
Well, I'm sure I will for simple things. For more complex things, I'll use
the pattern of checking **kw against class attributes to make sure they
exist. PEAK, for example, already has this ability built-in, so it's
definitely the path of least resistance for implementing a middleware
component in PEAK; just subclass binding.Component and add attribute
bindings for everything needed. I'd hate to give that up for a theoretical
argument that someday we might need some kind of arguments that aren't
arguments. It's not as if we couldn't define a new protocol, and a
different modifier in the deployment descriptor, if that day ever actually
arrived.
>>>Another part of the API that I can see as useful is passing in the
>>>distribution object itself.
>>
>>Which distribution? The one the entry point came from? It already knows
>>(or can find out) what distribution it's in.
>
>I mean like:
>
> [wsgi.app_factory]
> filebrowser = paste.wareweb:make_app
>
>Where paste.wareweb.make_app knows how to build an application from
>filename conventions in the package itself, even though the paste.wareweb
>module isn't in the project itself.
Oh. I think I get you now; you want to be able to define an entry point
that wraps itself in something else. I don't see though why I can't just
put the wrapper code in myself, like this:
def my_app(*args, **kw):
return paste.wareweb.make_app(
pkg_resources.get_provider(__name__), *args, **kw
)
And then just make the entry point refer to this. Or, if you want to be fancy:
my_app = paste.wareweb.app_maker(__name__)
This seems more than sufficient for the use case.
More information about the Web-SIG
mailing list