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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
from django.conf import settings
import re
import unicodedata
# this is not intended to be an all-knowing IP address regex
IP_RE = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
def get_ip(request):
"""Retrieves the remote IP address from the request data.
If the user is
behind a proxy, they may have a comma-separated list of IP addresses, so
we need to account for that. In such a case, only the first IP in the
list will be retrieved. Also, some hosts that use a proxy will put the
REMOTE_ADDR into HTTP_X_FORWARDED_FOR. This will handle pulling back the
IP from the proper place.
"""
# if neither header contain a value, just use local loopback
ip_address = request.META.get('HTTP_X_FORWARDED_FOR',
request.META.get('REMOTE_ADDR', '127.0.0.1'))
if ip_address:
# make sure we have one and only one IP
try:
ip_address = IP_RE.match(ip_address)
if ip_address:
ip_address = ip_address.group(0)
else:
# no IP, probably from some dirty proxy or other device
# throw in some bogus IP
ip_address = '10.0.0.1'
except IndexError:
pass
return ip_address
def get_timeout():
"""Gets any specified timeout from the settings file, or use 10 minutes by
default."""
return getattr(settings, 'TRACKING_TIMEOUT', 10)
def get_cleanup_timeout():
"""
Gets any specified visitor clean-up timeout from the settings file, or
use 24 hours by default
"""
return getattr(settings, 'TRACKING_CLEANUP_TIMEOUT', 24)
def u_clean(s):
"""A strange attempt at cleaning up unicode."""
uni = ''
try:
# try this first
uni = str(s).decode('iso-8859-1')
except UnicodeDecodeError:
try:
# try utf-8 next
uni = str(s).decode('utf-8')
except UnicodeDecodeError:
# last resort method... one character at a time (ugh)
if s and type(s) in (str, unicode):
for c in s:
try:
uni += unicodedata.normalize('NFKC', unicode(c))
except UnicodeDecodeError:
uni += '-'
return uni.encode('ascii', 'xmlcharrefreplace')
|