mirror of
https://github.com/django/django.git
synced 2024-12-23 01:25:58 +00:00
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.contrib.flatpages.models import FlatPage
|
||||
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.shortcuts import get_object_or_404
|
||||
from django.template import loader, RequestContext
|
||||
@ -70,5 +69,4 @@ def render_flatpage(request, f):
|
||||
'flatpage': f,
|
||||
})
|
||||
response = HttpResponse(t.render(c))
|
||||
populate_xheaders(request, response, FlatPage, f.id)
|
||||
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
|
||||
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
|
||||
==========================
|
||||
|
||||
|
@ -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
Block a user