We can do a gotomeeting. Perhaps around lunchtime eastern on Sunday? On Aug 2, 2014 2:08 PM, <[email protected]> wrote:
> Hello Jason, > > Thank you very much for your kind and swift offer. I'll do it gladly ... > but I need to set-up Skype on my station :-( and register a Skype account. > I'm an old-timer and my only contact is Gmail. I have no G+, no Facebook, > no Twitter, ... > > What is your preferred day and time for a Skype call. > I live in the Paris-Luxembourg-Brussels time zone. For instance it is now > Saturday Aug. 2, 20:05. > > When you say privately, I suppose a one-to-one call on Skype and I suppose > I can easily find your name there. > > Have a nice Sunday and thanks again, > > René > > On Saturday, August 2, 2014 6:35:33 PM UTC+2, Jason Garber wrote: >> >> Hi Rene, >> >> I offer to do a skype call with you to review all of this as I have been >> there done that and have a crisp understanding of all the working parts. >> >> Contact me privately if you want to do this. >> >> Thanks, >> Jason >> On Aug 2, 2014 12:32 PM, <[email protected]> wrote: >> >>> Dear Graham & al., >>> >>> Congratulations for your software and documentation. I have however some >>> difficulties as outlined in the subject caption. >>> >>> I'm building a case study for an application on an intranet within a >>> company where the users would interact with their browser communicating >>> with the Apache2/mod_wsgi server (daemon mode + multi-threads). >>> >>> However I'm afraid I'm misunderstanding some important underlying >>> concepts of the architecture. Please allow me to give an example and to >>> give you my thoughts - which could go wrong somewhere. >>> >>> *Part 1:* >>> >>> I wrote a simple HTML page with a one field input form. >>> >>> In my `environment` dictionary, I have, among other key/value pairs, the >>> following: >>> >>> REQUEST_METHOD: POST >>> REQUEST_URI: /core/my-wsgi-app >>> mod_wsgi.callable_object: application >>> >>> The first two values come obviously from my html <form >>> action="core/my-wsgi-app" method="post">...</form>, and the third value is >>> the default value in the configuration directive (WSGICallableObject >>> application). >>> >>> In my my-wsgi-app script, I have of course: >>> >>> def application (environment, start_response): >>> [my code here] >>> return [response_body] >>> >>> So all is fine and works well but there is something I don't get (I mean >>> I haven't fully assimilated), certainly in a multi-users, multi-threads, >>> ... environment. The main question is about the WSGICallableObject. >>> >>> The documentation (https://code.google.com/p/modwsgi/wiki/ >>> ConfigurationDirectives#WSGICallableObject) says "*The >>> WSGICallableObject directive can be used to override the name of the Python >>> callable object in the script file which is used as the entry point into >>> the WSGI application.*" [underlining is mine]. For me the WSGI >>> application is the whole application: when finished the target application >>> I'm case studying could serve one hundred users, delivering thousands of >>> pages built dynamically over hundreds of SQL tables, ... Am I right in >>> thinking than one entry point would be fit for such purpose. The size of >>> the application is such that I already opted for a daemon configuration >>> with multi-threads (I do not wish to have users waiting in a single queue >>> because one of them is building a page that takes seconds to assemble). >>> >>> Having one single callable object seems to give me these only 4 options: >>> >>> 1) Have only one single REQUEST_URI, say /core/my-wsgi-app, where only >>> one callable object (function, class, ...) is used under the one and same >>> name (application). In such case that callable object is the one and only >>> full single entry point to the overall application (thousands of pages >>> built dynamically) and I must care for checking, authorisation, parsing, >>> dispatching, ... and finally assembling the response and returning it. I'm >>> wondering if this single script/callable-object could become a bottleneck. >>> It is the concern I've just expressed. Of course, Python can handle >>> hundreds of function calls and instance calls. This option makes me doubt I >>> fully understand the mechanism. I call this option N to 1. >>> >>> 2) Have various REQUEST_URI (even one per page if need be) and in each >>> called script, there would be one callable object with the same name >>> ("application" as defined in the WSGICallableObject directive). In that >>> case, I could create a callable instance of a base class but that instance >>> should bear the application name and use the two positional arguments >>> passed by mod_wsgi. This option, if used exclusively, seems to me like a >>> normal "CGI static serving", i.e. one request activates one script (the >>> whole logic and dynamism is in the script). This point too makes me doubt I >>> understand the real nature of WSGI. I call this option N to N. >>> >>> 3) One could combine option 1 and 2 to create more dynamism without >>> risking the potential (?) bottleneck of option 1 when used alone. I call >>> this option N to M (<<N) >>> >>> 4) There seems to be a possibility to define the WSGICallableObject per >>> directory. My understanding is that the REQUEST_URI belonging to a >>> directory (and its sub-directories) would use that callable object name. >>> This means for instance that any URI of the form /core/section-1/abc would >>> have a callable object Application_1, while any URI under >>> /core/section-N/... would have a callable object Application_N. I haven't >>> tried this directive yet so I may misunderstand its role. >>> >>> This is my overall understanding but I'm afraid I'm missing something >>> fundamental [please note that I'm not an English speaker and I might have >>> missed subtleties in the documentation which is quite dense]. I tried to >>> picture this in a diagram but I'm not sure I got it right: >>> >>> M (html requests) -> 1 (http server) -> N x P (mod_wsgi daemons x >>> threads) -> X? (Python instance(s) / one per daemon ? I don't know) -> M >>> (calls to one object in one URI or to many objects - named the same - in >>> many URI ? ) and back to the user via the same route. >>> >>> I assume that one user html request generates ultimately one call to a >>> callable object (give or take) : that's why I use M in toth cases. Is this >>> assumption correct ? My dilemma is that I can't understand the spread of >>> the load between the 2 extremes: one URI containing the `application` >>> callable object (that is eventually called hundreds of times per second) or >>> many hundreds URI each containing a callable object named `application` >>> that all get called much less frequently. >>> >>> *Part 2:* >>> >>> As a consequence of this hazy understanding of mine, I wonder why can't >>> the name of the callable object be chosen on demand ? >>> >>> If I refer to PEP3333 (http://legacy.python.org/dev/peps/pep-3333/) I >>> understand that: >>> " >>> *A server or gateway must invoke the application object using positional >>> (not keyword) arguments. (E.g. by calling result = application(environ, >>> start_response)*" >>> >>> So my guess is that, still referring to the example at the top, one >>> thread in mod_wsgi loads (I wouldn't call this an import) the >>> /core/my-wsgi-app script and calls application(environment, start_response) >>> that has been defined in it. Is this the correct mechanism ? >>> >>> Could we imagine that mod_wsgi would sometime call my_App (arg1, arg2), >>> some other time call your_App (req, resp) or call Small_app (in, out) where >>> my_App, your_App, Small_app would be defined because mod_wsgi would be able >>> to set dynamically the WSGICallableObject . Imagine that in the >>> WSGIImportScript script file, we would have: >>> >>> def my_App (param1, param2): >>> [code here] >>> return [my_Response] >>> >>> def your_App (param1, param2): >>> [code here] >>> return [your_Response] >>> >>> def Small_app (param1, param2): >>> [code here] >>> return [Small_response] >>> >>> all the functions would be ready to be called. >>> >>> I suppose that in any case we are limited: >>> >>> A) by the HTTP protocol (URI given via the action attribute, the POST, >>> GET, OPTIONS, ... from the method attribute and the key/value pairs from >>> the various input fields); and >>> >>> B) by directives we could give to configure mod_wsgi. I guess it is >>> not the role neither the intend to build some "user logic" within mod_wsgi. >>> >>> *Conclusions:* >>> >>> 1) Am I correct in my understanding of mod_wsgi as expressed here above >>> (Part 1) ? Beware that I could be out of my depth, i.e. talking about >>> something I don't properly understand. In that case please correct me or >>> complement my view. >>> >>> 2) Do we need to dynamically choose the callable object name for the >>> sake of dynamism and multiplicity ? >>> >>> -> If not, the current set-up is enough. In which case is the preceding >>> point ( 1) ) complete and correct ? >>> >>> -> If yes, how to do it simply and elegantly ? >>> >>> => Idea 1: create an extra key/value pair (e.g. >>> wsgi_callable_object=my_application). It seems cumbersome to me. >>> >>> => Idea 2: if the URI were to have the form >>> /core/my-wsgi-app/_my_application then mod_wsgi could provide: >>> REQUEST_URI: /core/my-wsgi-app >>> mod_wsgi.callable_object: my_application >>> in the 'environment` dictionary because it would strip the >>> trailing part beginning with an underscore provided it is told to do so by >>> a directive; >>> otherwise it would behave as now and deliver: >>> REQUEST_URI: /core/my-wsgi-app/_my_application >>> mod_wsgi.callable_object: application >>> >>> *Thanks:* >>> >>> I do realize this is an unusual post (maybe it should find its way in >>> the group working on the documentation) but I would be very happy if some >>> of you could answer / feedback to me. In any case I do thank you all in >>> advance. >>> >>> René >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "modwsgi" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at http://groups.google.com/group/modwsgi. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- > You received this message because you are subscribed to the Google Groups > "modwsgi" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/modwsgi. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "modwsgi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/modwsgi. For more options, visit https://groups.google.com/d/optout.
