Re: HttpResponse.has_header
On Sat, May 11, 2013 at 7:30 AM, Masklinn <masklinn@masklinn.net> wrote:
> On 2013-05-11, at 15:08 , Larry Martell wrote:
>> On Fri, May 10, 2013 at 2:13 PM, Larry Martell <larry.martell@gmail.com> wrote:
>>> On Fri, May 10, 2013 at 9:37 AM, Larry Martell <larry.martell@gmail.com> wrote:
>>>> On Fri, May 10, 2013 at 8:55 AM, Tom Evans <tevans.uk@googlemail.com> wrote:
>>>>> On Fri, May 10, 2013 at 2:52 PM, Larry Martell <larry.martell@gmail.com> wrote:
>>>>>> Just upgraded to 1.5 and my app is failing with:
>>>>>>
>>>>>> Internal Server Error:
>>>>>> Traceback (most recent call last):
>>>>>> File "/Library/Python/2.7/site-packages/django/core/handlers/base.py",
>>>>>> line 187, in get_response
>>>>>> response = middleware_method(request, response)
>>>>>> File "/Library/Python/2.7/site-packages/django/contrib/sessions/middleware.py",
>>>>>> line 26, in process_response
>>>>>> patch_vary_headers(response, ('Cookie',))
>>>>>> File "/Library/Python/2.7/site-packages/django/utils/cache.py",
>>>>>> line 142, in patch_vary_headers
>>>>>> if response.has_header('Vary'):
>>>>>> [error] AttributeError: 'function' object has no attribute 'has_header'
>>>>>>
>>>>>> My code that is triggering this:
>>>>>>
>>>>>> if report_response.has_header('Content-disposition'):
>>>>>>
>>>>>> I didn't see anything in the docs that said this method was being
>>>>>> removed from the HttpResponse class.
>>>>>>
>>>>>
>>>>> It hasn't. If you look at the exception message closely, you will see
>>>>> that it does not say "HttpResponse object has no attribute ...", it
>>>>> says "function object has no attribute ...". Somehow, this middleware
>>>>> is receiving a function instead of a response object.
>>>>>
>>>>>> Anyone know how I can fix this so I can use 1.5?
>>>>>>
>>>>>
>>>>> The full stack trace may explain more, but then again maybe not - the
>>>>> exception happens in middleware processing, but the error is returning
>>>>> a function instead of a HttpResponse object in the content generation
>>>>> phase (ie in the view). You will probably need to look closely at each
>>>>> function the request passes through on this particular request, and
>>>>> work out where the bogus return value is coming from.
>>>>
>>>> That is the full stack trace. I have just one piece of middleware:
>>>>
>>>> import re
>>>> class LastSiteUrl(object):
>>>>
>>>> def is_admin_url(self, url):
>>>> if re.search('^(http:\/\/.*){0,1}\/admin\/', url) is None: return(False)
>>>> else: return(True)
>>>>
>>>> def process_request(self, request):
>>>> if self.is_admin_url(request.path) and \
>>>> not self.is_admin_url(request.META['HTTP_REFERER']):
>>>> request.session['last_site_url'] = request.META['HTTP_REFERER']
>>>>
>>>> I don't see how that could be causing this. What changed in 1.5 to
>>>> break this? In 1.4 I do not get this error with the same middleware.
>>>
>>> I traced it all through base.py and the issue seems to be that my
>>> views don't return a HttpResponse object. I have to go back to 1.4 and
>>> my old code and see what it's returning there (I made a lot of changes
>>> for direct_to_template and redirect_to). I wouldn't think an upgrade
>>> would require so many changes :-(
>>
>> So here's the problem. I replaced direct_to_template with
>> TemplateView.as_view (as I read at
>> https://docs.djangoproject.com/en/1.4/topics/generic-views-migration/)
>> but direct_to_template returned a HttpResponse object and
>> TemplateView.as_view does not.
>
> as_view itself does not (and should not), since its job is to return a
> view callable which will reply to requests.
>
> TemplateView most definitely returns an HttpResponse though. More
> precisely it returns a TemplateResponse which extends SimpleTemplateResponse
> which extends HttpResponse:
>
> as_view[0] returns a ``view`` function[1] which dispatches the request
> to a CBV method based on the request's HTTP method[2]. That is
> TemplateView.get[3] which calls render_to_response on the
> TemplateResponseMixin[4]. Said render_to_response returns a new instance
> of self.response_class[5], which defaults to TemplateResponse[6] which
> as already noted is a subclass of HttpResponse through
> SimpleTemplateResponse[7].
>
> Are you sure you're using TemplateView correctly? Could you post your
> urlconf? If you got a function is it possible that you replaced
>
> (pattern, direct_to_template, {'template': template_name})
>
> by
>
> (pattern, TemplateView.as_view, {'template': template_name})
>
> and thus got the ``view`` function[1] as a "response"?
Yes, that is what I did. This is not in my urlconf. It's in a view
function. I replaced:
return direct_to_template(request, template)
by:
return TemplateView.as_view(template_name=template)
Is that not correct? Should I not be using as_view? I just tried using
TemplateView(template_name=template) and I got the same error.
>
>> It then blows up at:
>>
>> File "/Library/Python/2.7/site-packages/django/utils/cache.py", line
>> 142, in patch_vary_headers
>> if response.has_header('Vary'):
>> AttributeError: 'function' object has no attribute 'has_header'
>>
>> Surely others must have changed direct_to_template to TemplateView.
>> How do I get around this?
>
> [0] https://github.com/django/django/blob/master/django/views/generic/base.py#L46
> [1] https://github.com/django/django/blob/master/django/views/generic/base.py#L61
> [2] https://github.com/django/django/blob/master/django/views/generic/base.py#L83
> [3] https://github.com/django/django/blob/master/django/views/generic/base.py#L152
> [4] https://github.com/django/django/blob/master/django/views/generic/base.py#L118
> [5] https://github.com/django/django/blob/master/django/views/generic/base.py#L127
> [6] https://github.com/django/django/blob/master/django/views/generic/base.py#L115
> [7] https://github.com/django/django/blob/master/django/template/response.py#L10
--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home