使用命名组在视图django中调用函数

时间:2011-08-10 16:51:03

标签: django url

我不知道这样的事情是否可能,但我想根据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 个答案:

答案 0 :(得分:4)

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])

答案 1 :(得分:0)

使用此:

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

虽然这种事情有点安全风险,因为任何用户都可以通过传递正确的“funcname”来调用python可用的任意函数。