durusmail: qp: Twisted - Was: Re: Quixote, QP, the future...?
Twisted - Was: Re: Quixote, QP, the future...?
2006-04-09
2006-04-09
2006-04-10
2006-04-10
2006-04-10
2006-04-10
2006-04-10
2006-04-10
2006-04-10
2006-04-10
2006-04-10
2006-04-12
2006-04-12
2006-04-13
2006-04-13
2006-04-13
2006-04-13
2006-04-14
2006-04-14
2006-04-15
2006-04-16
2006-04-16
Twisted - Was: Re: Quixote, QP, the future...?
David Binger
2006-04-10
On Apr 10, 2006, at 12:36 PM, David K. Hess wrote:

> On Apr 10, 2006, at 10:39 AM, David Binger wrote:
>> I was thinking of changing the run_web(self) call in start_web()
>> to "get_publisher().run_web()".  This lets the Publisher do
>> whatever it wants to do to get http/scgi or whatever running,
>> while preserving the basic start-stop/pidfile functionality of
>> the "qp" command line tool.  I'd rather not move start_web()
>> itself to the Publisher if we can help it.
>
> My concern is that I already handle forking and pidfile management
> elsewhere so I need that behavior in start_web factored out. In my
> case QP is not the application, just a feature of another application.

Understood.  If you are not using the qp tool for site management,
though, then there is no need to for you to call the Site.start_web()
method.  You can just call your function that configures your
reactor the way you want it.

>
>> If you are not using the qp script for controlling the publisher,
>> then
>> you have an easy way to direct your site-control to your custom
>> Site subclass,
>> with start_web() doing what you need to tell the reactor about your
>> application.  That seems like a reasonable way to get your job done.
>>
>> Note that you can call the start/stop durus methods from your
>> own script without changing anything.
>
> Given my concern above, this might be a better approach. Though,
> the Site.get_sites interface might need to be touched since it
> explicitly doles out Site objects.

I don't see any need for your code to call Site.get_sites().
Don't you just have one site to take care of?
Just say "x=Site('mysite'); x.start_durus(); prepare_reactor(x)"
where prepare_reactor() calls methods on x to get the server
addresses it needs.


>
>> I think it would be nice to have a function like this:
>>
>> def get_reactor(site):
>>     """
>>     Return a twisted reactor configured for this site.
>>     """
>>
>> This could be used in a SitePublisher.run_web() implementation that
>> may or may not call run().  It could also be used directly in
>> other scripts that start twisted servers for QP sites.
>>
>> I don't think a TwistedPublisher subclass is necessary.
>
> I guess the beauty of adding run_web to the Publisher is that
> people have ready access to overriding it. But if I have to
> subclass Site anyway to change as much behavior as I need to,
> perhaps I'm better off encapsulating all of the twisted stuff over
> there?

Yes.  That's what I would do.  The run_web() method would mostly be for
applications that want the qp tool to manage web services in a
nonstandard
way.

>
> Does this make the case for a Site subclass instantiated from
> slash.py?

That path gets tangled pretty quickly.
The Site class is what qp depends on to find slash.py.

If anyone wants all of their apps to run with a different Site class, I
think they should change the import in (a copy of) the bin/qp file.

If anyone really wants a particular QP publisher to run with a
different site class,
then I'd suggest putting "self.site.__class__ = MySiteClass" in the
SitePublisher.__init__().

reply