Fixed #13285: populate_xheaders breaks caching
This commit is contained in:
parent
63a9555d57
commit
64e11a68f1
|
@ -1,7 +1,6 @@
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.flatpages.models import FlatPage
|
from django.contrib.flatpages.models import FlatPage
|
||||||
from django.contrib.sites.models import get_current_site
|
from django.contrib.sites.models import get_current_site
|
||||||
from django.core.xheaders import populate_xheaders
|
|
||||||
from django.http import Http404, HttpResponse, HttpResponsePermanentRedirect
|
from django.http import Http404, HttpResponse, HttpResponsePermanentRedirect
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.template import loader, RequestContext
|
from django.template import loader, RequestContext
|
||||||
|
@ -70,5 +69,4 @@ def render_flatpage(request, f):
|
||||||
'flatpage': f,
|
'flatpage': f,
|
||||||
})
|
})
|
||||||
response = HttpResponse(t.render(c))
|
response = HttpResponse(t.render(c))
|
||||||
populate_xheaders(request, response, FlatPage, f.id)
|
|
||||||
return response
|
return response
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
"""
|
|
||||||
Pages in Django can are served up with custom HTTP headers containing useful
|
|
||||||
information about those pages -- namely, the content type and object ID.
|
|
||||||
|
|
||||||
This module contains utility functions for retrieving and doing interesting
|
|
||||||
things with these special "X-Headers" (so called because the HTTP spec demands
|
|
||||||
that custom headers are prefixed with "X-").
|
|
||||||
|
|
||||||
Next time you're at slashdot.org, watch out for X-Fry and X-Bender. :)
|
|
||||||
"""
|
|
||||||
|
|
||||||
def populate_xheaders(request, response, model, object_id):
|
|
||||||
"""
|
|
||||||
Adds the "X-Object-Type" and "X-Object-Id" headers to the given
|
|
||||||
HttpResponse according to the given model and object_id -- but only if the
|
|
||||||
given HttpRequest object has an IP address within the INTERNAL_IPS setting
|
|
||||||
or if the request is from a logged in staff member.
|
|
||||||
"""
|
|
||||||
from django.conf import settings
|
|
||||||
if (request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS
|
|
||||||
or (hasattr(request, 'user') and request.user.is_active
|
|
||||||
and request.user.is_staff)):
|
|
||||||
response['X-Object-Type'] = "%s.%s" % (model._meta.app_label, model._meta.model_name)
|
|
||||||
response['X-Object-Id'] = str(object_id)
|
|
|
@ -491,6 +491,11 @@ Miscellaneous
|
||||||
memcache backend no longer uses the default timeout, and now will
|
memcache backend no longer uses the default timeout, and now will
|
||||||
set-and-expire-immediately the value.
|
set-and-expire-immediately the value.
|
||||||
|
|
||||||
|
* The ``django.contrib.flatpages`` app used to set custom HTTP headers for
|
||||||
|
debugging purposes. This functionality was not documented and made caching
|
||||||
|
ineffective so it has been removed, along with its generic implementation,
|
||||||
|
previously available in ``django.core.xheaders``.
|
||||||
|
|
||||||
Features deprecated in 1.6
|
Features deprecated in 1.6
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<django-objects version="1.0">
|
|
||||||
<object pk="100" model="auth.user">
|
|
||||||
<field type="CharField" name="username">super</field>
|
|
||||||
<field type="CharField" name="first_name">Super</field>
|
|
||||||
<field type="CharField" name="last_name">User</field>
|
|
||||||
<field type="CharField" name="email">super@example.com</field>
|
|
||||||
<field type="CharField" name="password">sha1$995a3$6011485ea3834267d719b4c801409b8b1ddd0158</field>
|
|
||||||
<field type="BooleanField" name="is_staff">True</field>
|
|
||||||
<field type="BooleanField" name="is_active">True</field>
|
|
||||||
<field type="BooleanField" name="is_superuser">True</field>
|
|
||||||
<field type="DateTimeField" name="last_login">2007-05-30 13:20:10</field>
|
|
||||||
<field type="DateTimeField" name="date_joined">2007-05-30 13:20:10</field>
|
|
||||||
<field to="auth.group" name="groups" rel="ManyToManyRel"></field>
|
|
||||||
<field to="auth.permission" name="user_permissions" rel="ManyToManyRel"></field>
|
|
||||||
</object>
|
|
||||||
<object pk="1" model="special_headers.article">
|
|
||||||
<field type="TextField" name="text">text</field>
|
|
||||||
</object>
|
|
||||||
</django-objects>
|
|
|
@ -1,5 +0,0 @@
|
||||||
from django.db import models
|
|
||||||
|
|
||||||
|
|
||||||
class Article(models.Model):
|
|
||||||
text = models.TextField()
|
|
|
@ -1 +0,0 @@
|
||||||
{{ object }}
|
|
|
@ -1,62 +0,0 @@
|
||||||
from django.contrib.auth.models import User
|
|
||||||
from django.test import TestCase
|
|
||||||
from django.test.utils import override_settings
|
|
||||||
|
|
||||||
|
|
||||||
@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
|
|
||||||
class SpecialHeadersTest(TestCase):
|
|
||||||
fixtures = ['data.xml']
|
|
||||||
urls = 'special_headers.urls'
|
|
||||||
|
|
||||||
def test_xheaders(self):
|
|
||||||
user = User.objects.get(username='super')
|
|
||||||
response = self.client.get('/special_headers/article/1/')
|
|
||||||
self.assertFalse('X-Object-Type' in response)
|
|
||||||
self.client.login(username='super', password='secret')
|
|
||||||
response = self.client.get('/special_headers/article/1/')
|
|
||||||
self.assertTrue('X-Object-Type' in response)
|
|
||||||
user.is_staff = False
|
|
||||||
user.save()
|
|
||||||
response = self.client.get('/special_headers/article/1/')
|
|
||||||
self.assertFalse('X-Object-Type' in response)
|
|
||||||
user.is_staff = True
|
|
||||||
user.is_active = False
|
|
||||||
user.save()
|
|
||||||
response = self.client.get('/special_headers/article/1/')
|
|
||||||
self.assertFalse('X-Object-Type' in response)
|
|
||||||
|
|
||||||
def test_xview_func(self):
|
|
||||||
user = User.objects.get(username='super')
|
|
||||||
response = self.client.head('/special_headers/xview/func/')
|
|
||||||
self.assertFalse('X-View' in response)
|
|
||||||
self.client.login(username='super', password='secret')
|
|
||||||
response = self.client.head('/special_headers/xview/func/')
|
|
||||||
self.assertTrue('X-View' in response)
|
|
||||||
self.assertEqual(response['X-View'], 'special_headers.views.xview')
|
|
||||||
user.is_staff = False
|
|
||||||
user.save()
|
|
||||||
response = self.client.head('/special_headers/xview/func/')
|
|
||||||
self.assertFalse('X-View' in response)
|
|
||||||
user.is_staff = True
|
|
||||||
user.is_active = False
|
|
||||||
user.save()
|
|
||||||
response = self.client.head('/special_headers/xview/func/')
|
|
||||||
self.assertFalse('X-View' in response)
|
|
||||||
|
|
||||||
def test_xview_class(self):
|
|
||||||
user = User.objects.get(username='super')
|
|
||||||
response = self.client.head('/special_headers/xview/class/')
|
|
||||||
self.assertFalse('X-View' in response)
|
|
||||||
self.client.login(username='super', password='secret')
|
|
||||||
response = self.client.head('/special_headers/xview/class/')
|
|
||||||
self.assertTrue('X-View' in response)
|
|
||||||
self.assertEqual(response['X-View'], 'special_headers.views.XViewClass')
|
|
||||||
user.is_staff = False
|
|
||||||
user.save()
|
|
||||||
response = self.client.head('/special_headers/xview/class/')
|
|
||||||
self.assertFalse('X-View' in response)
|
|
||||||
user.is_staff = True
|
|
||||||
user.is_active = False
|
|
||||||
user.save()
|
|
||||||
response = self.client.head('/special_headers/xview/class/')
|
|
||||||
self.assertFalse('X-View' in response)
|
|
|
@ -1,13 +0,0 @@
|
||||||
# coding: utf-8
|
|
||||||
from __future__ import absolute_import
|
|
||||||
|
|
||||||
from django.conf.urls import patterns
|
|
||||||
|
|
||||||
from . import views
|
|
||||||
from .models import Article
|
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
|
||||||
(r'^special_headers/article/(?P<object_id>\d+)/$', views.xview_xheaders),
|
|
||||||
(r'^special_headers/xview/func/$', views.xview_dec(views.xview)),
|
|
||||||
(r'^special_headers/xview/class/$', views.xview_dec(views.XViewClass.as_view())),
|
|
||||||
)
|
|
|
@ -1,21 +0,0 @@
|
||||||
from django.core.xheaders import populate_xheaders
|
|
||||||
from django.http import HttpResponse
|
|
||||||
from django.utils.decorators import decorator_from_middleware
|
|
||||||
from django.views.generic import View
|
|
||||||
from django.middleware.doc import XViewMiddleware
|
|
||||||
|
|
||||||
from .models import Article
|
|
||||||
|
|
||||||
xview_dec = decorator_from_middleware(XViewMiddleware)
|
|
||||||
|
|
||||||
def xview(request):
|
|
||||||
return HttpResponse()
|
|
||||||
|
|
||||||
def xview_xheaders(request, object_id):
|
|
||||||
response = HttpResponse()
|
|
||||||
populate_xheaders(request, response, Article, 1)
|
|
||||||
return response
|
|
||||||
|
|
||||||
class XViewClass(View):
|
|
||||||
def get(self, request):
|
|
||||||
return HttpResponse()
|
|
Loading…
Reference in New Issue