Files
@ a4255c7e5101
Branch filter:
Location: website/www/conservancy/middleware.py - annotation
a4255c7e5101
2.4 KiB
text/x-python
Add subscription form to the top right of the site (possibly all pages).
I was only able to get the site running on my local machine well enough to test the main page. It's possible, based on the filename, that the changes will appear on all Conservancy pages. I'm not sure if that is what is wanted or not. If not, it seems like some more invasive changes would need to be made to the base template so that the form would only appear on the index page.
The form POSTs to a mailman url. Once submitted, the user is redirected to the mailman site with no obvious way (aside from the back button) to return to the main site. This can be fixed by using AJAX to POST the form and report the subscription status back to the user, but it would likely require parsing the mailman html as there doesn't appear to be any real API to mailman.
I tested this in Firefox 11.0 and Chrome 18.0.1025.113 beta.
I was only able to get the site running on my local machine well enough to test the main page. It's possible, based on the filename, that the changes will appear on all Conservancy pages. I'm not sure if that is what is wanted or not. If not, it seems like some more invasive changes would need to be made to the base template so that the form would only appear on the index page.
The form POSTs to a mailman url. Once submitted, the user is redirected to the mailman site with no obvious way (aside from the back button) to return to the main site. This can be fixed by using AJAX to POST the form and report the subscription status back to the user, but it would likely require parsing the mailman html as there doesn't appear to be any real API to mailman.
I tested this in Firefox 11.0 and Chrome 18.0.1025.113 beta.
bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e bd6199f7b00e | from django.conf import settings
from django import http
from django.utils.cache import patch_response_headers
class ForceCanonicalHostnameMiddleware(object):
def process_request(self, request):
"""Modified common middleware for Conservancy site
* Performs redirects to strip trailing "index.html"
* performs redirects based on APPEND_SLASH
* performs redirects based on site-specific REDIRECT_TABLE
* adds cache headers to provide hints to squid
"""
# Check for a redirect based on settings.APPEND_SLASH
host = http.get_host(request)
old_url = [host, request.path]
new_url = old_url[:]
# Append a slash if append_slash is set and the URL doesn't have a
# trailing slash or a file extension.
if settings.APPEND_SLASH and (old_url[1][-1] != '/') and ('.' not in old_url[1].split('/')[-1]):
new_url[1] = new_url[1] + '/'
if settings.DEBUG and request.method == 'POST':
raise RuntimeError, "You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to %s%s (note the trailing slash), or set APPEND_SLASH=False in your Django settings." % (new_url[0], new_url[1])
# Strip trailing index.html
if new_url[1].endswith('/index.html'):
new_url[1] = new_url[1][:new_url[1].rfind('index.html')]
# Consult redirect table (if exists)
if hasattr(settings, "REDIRECT_TABLE"):
if settings.REDIRECT_TABLE.has_key(new_url[1]):
new_url[1] = settings.REDIRECT_TABLE[new_url[1]]
if new_url != old_url:
# Force canonical hostname
if settings.FORCE_CANONICAL_HOSTNAME:
new_url[0] = settings.FORCE_CANONICAL_HOSTNAME
# Redirect
if new_url[0]:
newurl = "%s://%s%s" % (request.is_secure() and 'https' or 'http', new_url[0], new_url[1])
else:
newurl = new_url[1]
if request.GET:
newurl += '?' + request.GET.urlencode()
return http.HttpResponseRedirect(newurl)
return None
def process_response(self, request, response):
# provide hints to squid
if request.method in ('GET', 'HEAD') and response.status_code == 200:
patch_response_headers(response)
return response
|