Django:LDAP搜索结果消失了

时间:2012-12-17 17:14:47

标签: ajax django ldap

为什么在下面的代码中,全局direktorie是否会在login()调试模板中返回正确的数据,但是当我尝试从autoname()访问同一个变量时,它会显示列表长度为0?我没有在direktorie中的任何其他地方或其他任何地方引用views.py。 (下面的所有代码只是试图发现我做错了什么。我并不真正关心返回列表的长度。我只是想知道它被看到并且具有大致正确的条目数。 )

from django.http           import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts      import render_to_response, get_object_or_404
import json                      # JSON for jQuery AJAX autocomplete
from   eldappery import *        # LDAP for jQuery AJAX autocomplete

direktorie = []

##############################################################################

def login(request):
  """LDAP Login routine"""
  global direktorie

  if request.method == "POST":                   # If submitted...
    if request.POST["username"] and request.POST["password"]:
      username = request.POST["username"]
      password = request.POST["password"]
      LDAPfeed = dapperize(username, password)   # ...login
      if LDAPfeed:
        direktorie = fetch_names(LDAPfeed,"")    # ...get everybody
        ls  = locals()                           # DEBUG!
        gs  = globals()                          # DEBUG!
        return render_to_response("debug.html",
                                  {"ls": ls,
                                   "gs": gs})    # DEBUG! Works! (direktorie full)
      else:
        return HttpResponseRedirect("/login/")
  return render_to_response("login.html",
                            context_instance=RequestContext(request))

##############################################################################

def autoname(request):
  """Auto-complete names"""
  global direktorie
  if request.is_ajax():
#   results = [{"id":    5,
#               "label": 5,
#               "value": 5}]                # DEBUG! Works! (5 in template)
    results = [{"id":    len(direktorie),
                "label": len(direktorie),
                "value": len(direktorie)}]  # DEBUG! Doesn't work! (0 in template)
    data = json.dumps(results)              # Convert to JSON string
  else:                                     # No results returned!
    data = "fail"                           # Error...
  mimetype = "application/json"             # MIME type = JSON
  return HttpResponse(data, mimetype)       # Send JSON back to web page

##############################################################################

2 个答案:

答案 0 :(得分:0)

松开线 -

global direktorie

您不需要将变量direktorie声明为全局变量,因为您没有为其赋值。 Python将假设赋值右侧的任何变量都是全局的(除非它出现在赋值的左侧,在函数的其他位置)。

此外,您可能希望使用单个进程检查您的网络服务器是否正在运行您的应用。如果它是为多个进程设置的,例如使用apache配置指令,如 -

WSGIDaemonProcess yoursite.com processes=2 threads=15

那么你将遇到全局指令的问题。

答案 1 :(得分:0)

django视图的设计,不允许你在视图之间传递全局变量。如果你想传递视图之间的数据,你需要使用ajax,在get或post请求中发送数据。

def index(request):
    print 'helou'
    return render_to_response('index.html', {'lala': 'lala'})

    #index.html
    # <script type='text/javascript'>
    #  obj = {type:'get', url='/test/view0', data: {tamangandapio:'yeah'}, type='json',
    #         response: function (){ console.log(response) }
    #         }
    # $.ajax(obj);
    # </script>

def view0(request)
  #here you see the data send by the jquery code below
  print request.GET
  res = {'success':'i got it'}
  return HttpResponse(simplejson.dumps(res), mimetype='application/javascript')