suppressing exceptions is a perfect way of hiding errors and preventing people who wonder what's wrong from debugging them. - Legacy-Id: 7066
61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
import logging, json
|
|
|
|
from django.conf import settings
|
|
from django.views.generic.base import View
|
|
from django.http import HttpResponse, Http404
|
|
|
|
from dajaxice.exceptions import FunctionNotCallableError
|
|
from dajaxice.core import dajaxice_functions, dajaxice_config
|
|
|
|
log = logging.getLogger('dajaxice')
|
|
|
|
|
|
def safe_dict(d):
|
|
"""
|
|
Recursively clone json structure with UTF-8 dictionary keys
|
|
http://www.gossamer-threads.com/lists/python/bugs/684379
|
|
"""
|
|
if isinstance(d, dict):
|
|
return dict([(k.encode('utf-8'), safe_dict(v)) for k, v in d.iteritems()])
|
|
elif isinstance(d, list):
|
|
return [safe_dict(x) for x in d]
|
|
else:
|
|
return d
|
|
|
|
|
|
class DajaxiceRequest(View):
|
|
""" Handle all the dajaxice xhr requests. """
|
|
|
|
def dispatch(self, request, name=None):
|
|
|
|
if not name:
|
|
raise Http404
|
|
|
|
# Check if the function is callable
|
|
if dajaxice_functions.is_callable(name, request.method):
|
|
|
|
function = dajaxice_functions.get(name)
|
|
data = getattr(request, function.method).get('argv', '')
|
|
|
|
# Clean the argv
|
|
if data != 'undefined':
|
|
try:
|
|
data = safe_dict(json.loads(data))
|
|
except Exception:
|
|
data = {}
|
|
else:
|
|
data = {}
|
|
|
|
# Call the function. If something goes wrong, handle the Exception
|
|
try:
|
|
response = function.call(request, **data)
|
|
except Exception:
|
|
raise # always give us a backtrace
|
|
if settings.DEBUG:
|
|
raise
|
|
response = dajaxice_config.DAJAXICE_EXCEPTION
|
|
|
|
return HttpResponse(response, mimetype="application/x-json")
|
|
else:
|
|
raise FunctionNotCallableError(name)
|