On 2013-05-11, at 15:08 , Larry Martell wrote:
> On Fri, May 10, 2013 at 2:13 PM, Larry Martell <[email protected]> 
> wrote:
>> On Fri, May 10, 2013 at 9:37 AM, Larry Martell <[email protected]> 
>> wrote:
>>> On Fri, May 10, 2013 at 8:55 AM, Tom Evans <[email protected]> wrote:
>>>> On Fri, May 10, 2013 at 2:52 PM, Larry Martell <[email protected]> 
>>>> 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"?

> 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to