On Sat, May 11, 2013 at 7:30 AM, Masklinn <[email protected]> wrote:
> 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"?
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 [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.