Использование именованной группы для вызова функции в представлении django - PullRequest
1 голос
/ 10 августа 2011

Не знаю, возможно ли что-то подобное, но я бы хотел вызвать функцию, основанную на значении именованной группы в конфигурации urls.py.

Это то, на что я смотрел

url.py сниппет

url(r'^ajax/ValidateLogin/(?P<funcname>\w{13})/$', Validate), 

views.py сниппет

def checkUsername(request):
  user = User.objects.get(username=request.POST.get('username',''))

  if user == None:
    response = simplejson.dumps({'success':'True','validate':'True'})
  else:
    response = simplejson.dumps({'success':'True','validate':'False'})
  return HttpResponse(response,content_type='application/javascript; charset=utf-8')

def Validate(request,funcname):
  return  funcname(request)

Это просто возвращает тот объект Unicode не вызываемый, что я понимаю, но как мне тогда преобразоватьэто вызвать функцию просмотра имени пользователя?Пример URL, который должен вызывать это: ajax / ValidateLogin / checkUsername

Спасибо

Ответы [ 2 ]

4 голосов
/ 10 августа 2011
remote_function_calls = {
    'check_username' : check_username,
}

def Validate(request, funcname):
    try:
        return remote_function_calls[funcname](request)
    except KeyError:
        response = http.HttpResponse("Invalid function")
        response.status_code = 403
        return response

Другой метод определения допустимых функций

def valid_function(request):
    return http.HttpResponse("This function may be called remotely")    
valid_function.remote_call_valid = True

def erase_everything_function(request):
    world.delete()

valid_functions = dict([(k, v) for k, v in globals().iteritems() if
    getattr(v, 'remote_call_valid', None) == True])
0 голосов
/ 10 августа 2011

Используйте это:

def Validate(request,funcname):
    return locals()[funcname](request)

Хотя такого рода вещи представляют собой небольшую угрозу безопасности, так как любой пользователь может вызвать любую произвольную функцию, доступную для python, передав правильное "funcname".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...