0

以下のコードで、グローバル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

##############################################################################
4

2 に答える 2

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')
于 2012-12-17T19:27:56.890 に答える
0

ラインを緩める -

global direktorie

direktorie変数に値を割り当てていないため、変数をグローバルとして宣言する必要はありません。Python は、代入の右側にある変数はすべてグローバルであると想定します (代入の左側、関数の他の場所にある場合を除きます)。

また、Web サーバーが単一のプロセスを使用してアプリを実行していることを確認することもできます。たとえば、次のようなApache構成ディレクティブを使用して、複数のプロセス用にセットアップされている場合-

WSGIDaemonProcess yoursite.com processes=2 threads=15

次に、グローバル ディレクティブで問題が発生します。

于 2012-12-17T18:44:47.213 に答える