No worries.  I'll find a workaround.

This is just behavior of the routes.py layer, nothing more.  Everything I 
showed you above was done with a debugger stopping execution at the point 
where "default/auth_search" was called.  I showed the url and args before 
any execution of the routine itself. Only routes.py was involved, not my 
code at all.  The call was always made to 
"/swim_smarter/default/auth_search/contents" in each case but handled by 
routes.py (and maybe URL()) differently.

Honestly I've always thought routes.py was a little mysterious and 
"magical" and I don't like relying on magic for a deployed website.  So 
learning url-rewriting in Apache is probably the best thing to do long term 
anyway.

Warm regards,

Joe


On Sunday, October 9, 2016 at 5:08:22 PM UTC-7, Anthony wrote:
>
> I would recommend either attaching an app and routes.py that reproduces 
> the problem, or describing precisely how to replicate, as it is not clear 
> exactly what you are doing. If the problem is unrelated to your special 
> class, then just exclude that.
>
> Anthony
>
> On Sunday, October 9, 2016 at 4:24:48 PM UTC-4, Joe Barnhart wrote:
>>
>> I pulled the request.url and request.args BEFORE my app was called.  This 
>> is exactly as my app sees it before any processing.
>>
>> The problem is that I get the "args" in one case but not in the other, 
>> depending entirely on routes.py.
>>
>> Even without any code from me at all, you could see the same effect with 
>> stock web2py.  My code is malfunctioning, to be sure, but the cause of its 
>> malfunction is the difference between using routes.py or not.
>>
>> At this point, I'm wondering what alternatives I have w/respect to not 
>> using routes.py at all.  Maybe I can use apache url rewriting to accomplish 
>> the same thing with more consistency.  I'm not really an apache expert, but 
>> it looks like I'm gonna have to learn more about it!
>>
>> -- Joe
>>
>>
>> On Sunday, October 9, 2016 at 9:26:51 AM UTC-7, Anthony wrote:
>>>
>>> For the actual requested URL, you want request.env.request_uri -- or 
>>> better yet, look at the outgoing request from the browser network tab.
>>>
>>> Not sure where you are checking for request.args in that code, but in 
>>> your __call__ method you have ra.pop(0), so at that point, you have deleted 
>>> the first URL arg from request.args -- it won't be there for any subsequent 
>>> references to request.args(0).
>>>
>>> I don't think we have the full picture here, as we're missing a lot of 
>>> the code. You might have to attach a minimal app (with routes.py) that 
>>> replicates the problem.
>>>
>>> Anthony
>>>
>>> On Sunday, October 9, 2016 at 3:40:15 AM UTC-4, Joe Barnhart wrote:
>>>>
>>>> Here is the actual URL called and args passed.  The "auth-like" 
>>>> function is auth_search and the argument should be "content"
>>>>
>>>> current.request.url
>>>> '/default/auth_search/content/'
>>>> current.request.args
>>>> []
>>>>
>>>> Or, with no routes.py, we see the application 'swim_smarter' come to 
>>>> the fore and now the args are passed.
>>>>
>>>> current.request.url
>>>> '/swim_smarter/default/auth_search/content/'
>>>> current.request.args
>>>> ['content']
>>>>
>>>> So let's try with routes.py but with no listing of "default" as the 
>>>> default controller
>>>>
>>>> current.request.url
>>>> '/default/auth_search/content/'
>>>> current.request.args
>>>> []
>>>>
>>>> I'm using the URL function to create the URL in all cases.
>>>>
>>>> When I say it "fails to work" I mean it leaves the request.args empty, 
>>>> and my magic function never invokes one of the sub-functions.  Thus it 
>>>> passes back the entire page created by the widget function of the default 
>>>> controller.  So it got a bunch of HTML when all it expected was some JSON 
>>>> from my sub-function.
>>>>
>>>> On Saturday, October 8, 2016 at 6:27:40 AM UTC-7, Anthony wrote:
>>>>>
>>>>> On Friday, October 7, 2016 at 11:29:36 PM UTC-4, Joe Barnhart wrote:
>>>>>>
>>>>>> I created some "widgets" (for lack of a more descriptive name) using 
>>>>>> the same pattern as the Auth object.  When you call it, it returns a 
>>>>>> special function that can respond to several different "sub-functions". 
>>>>>>  This has been tremendously handy but now I'm encountering a problem -- 
>>>>>> when I uses this in my "default" controller it fails to parse its 
>>>>>> sub-function properly.
>>>>>>
>>>>>> Here is the code, patterned after Auth:
>>>>>>
>>>>>>     def __call__(self):
>>>>>>         from gluon.http import HTTP
>>>>>>         request = current.request
>>>>>>         ra = request.args
>>>>>>         if not ra:
>>>>>>             return self.widget()
>>>>>>         if ra[0] in self.api:
>>>>>>             return getattr(self, ra.pop(0))()
>>>>>>         else:
>>>>>>             raise HTTP(404)
>>>>>>
>>>>>> The above code lives in a module, not a controller.  The method 
>>>>>> self.widget() just returns a dictionary that contains the html and 
>>>>>> so forth, for building the presentation of the widget.  The instance var 
>>>>>> self.api contains a list of "sub-functions" that, when called, will 
>>>>>> return something different than the widget() function.  Usually this 
>>>>>> is some sort of ajax function or other script-y thing that is called 
>>>>>> from 
>>>>>> the widget.
>>>>>>
>>>>>> My problem lies in the request.args[].  When called from any 
>>>>>> controller but my default, everything works perfectly.  The calling URL 
>>>>>> looks something like:
>>>>>>
>>>>>> /big_app/default/widget/sub_function/whatever
>>>>>>
>>>>>
>>>>> How are you generating that URL? With the router, presumably it should 
>>>>> just be /widget/sub_function/whatever, no?
>>>>>
>>>>> Also, what do you mean that it fails to work? Exactly what happens?
>>>>>
>>>>> We may need to see more code.
>>>>>
>>>>> Anthony
>>>>>
>>>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to