-
Notifications
You must be signed in to change notification settings - Fork 10
/
views.py
44 lines (33 loc) · 1.24 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from urlparse import urlparse
from django.core.urlresolvers import resolve, Resolver404
from django.http import HttpResponse, HttpResponseNotFound, QueryDict
from unfriendly import settings
from unfriendly.utils import Obfuscator
def deobfuscate(request, key, juice=None):
"""
Deobfuscates the URL and returns HttpResponse from source view.
SEO juice is mostly ignored as it is intended for display purposes only.
"""
obfuscator = Obfuscator(settings.UNFRIENDLY_SECRET)
try:
url = obfuscator.deobfuscate(str(key))
except:
return HttpResponseNotFound()
url_parts = urlparse(url)
path = url_parts.path
query = url_parts.query
try:
view, args, kwargs = resolve(path)
except Resolver404:
return HttpResponseNotFound()
# fix-up the request object
request.path = path
request.path_info = path
request.GET = QueryDict(query)
request.META['QUERY_STRING'] = query
request.META['PATH_INFO'] = path
response = view(request, *args, **kwargs)
# offer up a friendlier juice-powered filename if downloaded
if juice and not response.has_header('Content-Disposition'):
response['Content-Disposition'] = 'inline; filename=%s' % juice
return response