+1, this looks like a good change anyway and doesn't smell to me. On Fri, Nov 16, 2012 at 6:09 AM, Daniel Sokolowski <daniel.sokolow...@klinsight.com> wrote: > I like this approach. > > From: George Hickman > Sent: Thursday, November 15, 2012 7:27 AM > To: django-developers@googlegroups.com > Subject: Re: Class based views: A standard hook for http-method-independent > code > > I have a slightly different proposal, one where we can avoid the extra hook > but hopefully cover everyone's use cases too. > > https://github.com/ghickman/django/commit/85ac39a481074c25af1ed72a7a12e62ff5425e54 > > I've personally never liked the setting of args, kwargs & request from > within dispatch since it seems like it's feature creep of the dispatch > method. However I'm also in the same boat as many of the other posters here > in needing to do permissions related checks before dispatch is called. > > With my suggestion above you would be able to put your pre-dispatch code in > a subclasses overridden dispatch before calling super while also depending > on args, kwargs & request on self. > > On Thursday, November 15, 2012 4:18:34 AM UTC, Aaron Merriam wrote: >> >> If the super call changes any data then by the time you've run whatever >> code comes after the super call, the changes have already occured. >> >> >> If you wait to call super before running your own code, then request, >> args, and kwargs are not available on the request, so anything that depends >> on them being there (such as self.get_object()) will not work, so it must be >> re-implemented, >> Otherwise you have to set request, args, kwargs yourself which does not >> feel very DRY. >> >> For me, the entire reason I would like this change, is so that I can do >> something before dispatch that uses self.request/args/kwargs. Everything I >> want can be accomplished within dispatch, but not as cleanly, or as DRY as >> if this method hook existed. >> >> On Wednesday, November 14, 2012 6:49:06 AM UTC-7, Daniel Sokolowski wrote: >>> >>> Can you elaborate the nasty side effects you are thinking of? I can’t >>> think of any that that the base views do to warrant your statement. >>> >>> From: Aaron Merriam >>> Sent: Friday, November 09, 2012 3:12 PM >>> To: django-d...@googlegroups.com >>> Subject: Re: Class based views: A standard hook for >>> http-method-independent code >>> >>> That pattern has nasty side-effects. It can be used in some cases but it >>> fails in most. >>> >>> On Friday, November 9, 2012 8:28:47 AM UTC-7, Daniel Sokolowski wrote: >>>> >>>> I’ve done the below in the past, the only issue with that is if you have >>>> side effects in parent’s dispatch you don’t want executed but you would >>>> also >>>> run that risk if you had an initialize() method work flow; in the end I >>>> find >>>> dispatch() is enough in my experience. >>>> >>>> def dispatch(self, request, *args, **kwargs): >>>> parent_dispatch_return = super(Class, self).dispatch(request, *args, >>>> **kwargs) >>>> ...my code based on values based on the super call... >>>> return parent_dispatch_return >>>> >>>> From: Jordan Hagan >>>> Sent: Friday, November 09, 2012 12:37 AM >>>> To: django-d...@googlegroups.com >>>> Subject: Re: Class based views: A standard hook for >>>> http-method-independent code >>>> >>>> Hey Russ, >>>> >>>> The main point of concern which I think you may be missing is that >>>> self.kwargs and self.args are set inside dispatch, so using other mixins >>>> that require self.kwargs and self.args to be set (most do) will not work, >>>> without doing: >>>> >>>> def dispatch(self, request, *args, **kwargs): >>>> self.args = args; >>>> self.kwargs = kwargs >>>> self.init() >>>> return super(Class, self).dispatch(request, *args, **kwargs) >>>> >>>> Which isn't very tidy, to me having self.args and self.kwargs be set >>>> twice (once in my overridden dispatch method, and once in the original >>>> dispatch) feels wrong. I can't give you a good reason for it, it just feels >>>> bad every time I do it. The only way to work around this is to override >>>> dispatch without calling the original, and essentially duplicate the >>>> original dispatch method with an init call added in. >>>> >>>> Cheers, >>>> Jordan >>>> >>>> On Fri, Nov 9, 2012 at 6:25 PM, Russell Keith-Magee >>>> <rus...@keith-magee.com> wrote: >>>>> >>>>> >>>>> >>>>> On Fri, Nov 9, 2012 at 1:05 PM, Aaron Merriam <aaronm...@gmail.com> >>>>> wrote: >>>>>> >>>>>> Without setting request, args, and kwargs on on the view instance >>>>>> (which is done during the base dispatch view), anything in the view that >>>>>> assumes these values are present cannot run. >>>>>> >>>>>> Most of my views end up with functions which retrieve an object and >>>>>> then do some basic validation to ensure that a user has permissions, or >>>>>> that >>>>>> the object is valid in some fashion, or that some set of conditions is >>>>>> met >>>>>> prior to allowing any method call to happen. >>>>>> >>>>>> I have found that without this init method, the vast majority of my >>>>>> views end up re-writing dispatch which includes the super call. This is >>>>>> especially annoying when you have to compare some aspect of the >>>>>> requesting >>>>>> user with an object that must be looked up with something from args or >>>>>> kwargs. My view often already has this machinery built in, but it can't >>>>>> function without dispatch setting request, args, and kwargs, so to >>>>>> accomplish my check, I have to duplicate the lookup code in my dispatch >>>>>> method. >>>>>> >>>>>> I don't propose mine is the best solution, but I know that it is >>>>>> non-intrusive, simple, and covers my use cases well. It is also simple >>>>>> to >>>>>> accomplish any number of things since `init` merely needs to return a >>>>>> falsy >>>>>> value to allow the request to pass on through, raise an exception if that >>>>>> type of failure is desired, or return a response of it wants to hijack >>>>>> the >>>>>> view entirely. >>>>>> >>>>> >>>>> I'm starting to feel like I'm incredibly dense, because I still don't >>>>> understand what your use case *is* - or, at least, why what your proposing >>>>> provides any significant advantages over what you can do using basic >>>>> Python >>>>> inheritance techniques. >>>>> >>>>> Specifically, I still can't see why: >>>>> >>>>> class MyView(View): >>>>> def dispatch(self, request, *args, **kwargs): >>>>> init() >>>>> return super(MyView, self).dispatch(request, *args, **kwargs) >>>>> >>>>> def init(): >>>>> # your init logic here >>>>> >>>>> is superior to the solution provided by using basic Python inheritance: >>>>> >>>>> class MyView(View): >>>>> def dispatch(self, request, *args, **kwargs): >>>>> # your init logic here >>>>> return super(MyView, self).dispatch(request, *args, **kwargs) >>>>> >>>>> You have exactly the same workflow, and exactly the same order of >>>>> operations. You don't need to document any special CBV-specific API -- >>>>> e.g., >>>>> when/how init() will be invoked, and with what assumptions about the >>>>> request >>>>> environment can be made -- and you don't have to incur the overhead of a >>>>> function call (ok - the overhead is tiny, but let's not pretend it's >>>>> zero). >>>>> >>>>> So - can someone explain to me what the advantage is? Why is this >>>>> init() method needed? >>>>> >>>>> Yours, >>>>> Russ Magee %-) >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Django developers" group. >>>>> To post to this group, send email to django-d...@googlegroups.com. >>>>> To unsubscribe from this group, send email to >>>>> mailto:django-developers%2bunsubscr...@googlegroups.com. >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/django-developers?hl=en. >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Django developers" group. >>>> To post to this group, send email to django-d...@googlegroups.com. >>>> To unsubscribe from this group, send email to >>>> django-develop...@googlegroups.com. >>>> For more options, visit this group at >>>> http://groups.google.com/group/django-developers?hl=en. >>>> >>>> Daniel Sokolowski >>>> http://webdesign.danols.com/ >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "Django developers" group. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msg/django-developers/-/41VjHYR1wmYJ. >>> To post to this group, send email to django-d...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> django-develop...@googlegroups.com. >>> For more options, visit this group at >>> http://groups.google.com/group/django-developers?hl=en. >>> >>> Daniel Sokolowski >>> http://webdesign.danols.com/ > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/django-developers/-/R-pHy86EH7IJ. > To post to this group, send email to django-developers@googlegroups.com. > To unsubscribe from this group, send email to > django-developers+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-developers?hl=en. > > Daniel Sokolowski > http://webdesign.danols.com/ > > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To post to this group, send email to django-developers@googlegroups.com. > To unsubscribe from this group, send email to > django-developers+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-developers?hl=en.
-- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.