No problem. I'm here certainly till 3PM your time ...

On Sunday, August 3, 2014 3:29:30 PM UTC+2, Jason Garber wrote:
>
> Hi Rene,
>
> I will be a bit later today as the family and I are going out now.  I will 
> contact you when I return - likely around 2:00 my time (+/-)
>
> Thanks!
> Jason
> On Aug 3, 2014 9:27 AM, <[email protected] <javascript:>> wrote:
>
>> Thank you Jason. I registered on Skype (rene.heymans).
>> You can try around noon your time (6PM mine).
>> Till then.
>> Regards, René
>>
>> On Saturday, August 2, 2014 9:16:29 PM UTC+2, Jason Garber wrote:
>>>
>>> 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_applicat
>>>>>> ion
>>>>>>                         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] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> 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.

Reply via email to