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.