2

グローバル変数に依存する Django アプリを作成しました。これは実際には、view.py のすべての機能で利用できるリポジトリ オブジェクトのようなものです。

コードからわかるように、各ビュー関数は rp グローバル変数を変更します。

view.py

def index(request):
    global rp
    rp = repo.Repo()
    ...
    rp.function1()
    rp.function2()
    rp.attribute1 = value

    return render_to_response('result_pick.html',{'result_list': rp.parsed_output_data, 'input_file_name': rp.input_file_name }, context_instance = RequestContext(request))

def result(request):
    global rp
    rp.function3()
    local_atribute = rp.attribute1
    ....
    return render_to_response('result_show.html' ,{'rp':rp}, context_instance = RequestContext(request))

少しブラウジングした後、複数のユーザーがグローバル rp を共有し、問題が発生するため、複数のユーザーが Web ページにアクセスする瞬間にこれが失敗するという印象を受けました。

グローバル変数を取り除き、両方の関数で rp にアクセスできるようにするための推奨される解決策は何ですか?

4

1 に答える 1

5

セッションフレームワークを使用します。これは、リクエスト間(つまり、ビューメソッド間)でオブジェクトを永続化します。

セットアップが完了すると、次のように簡単になります。

def a_method(request):
   shared_obj = request.session.get('myobj',{}) # set dict as default
   shared_obj['key'] = 'val'
   request.session['myobj'] = shared_obj
   # your normal code
   return render(request,'sometemplate.html') # no need to pass 'shared_obj'

def b_method(request):
    shared_obj = request.session.get('myobj',{})
    if not shared_obj:
       # session was terminated, so initialize this object
       shared_obj['key'] = 'value'
     else:
       the_value = shared_obj['key']
       # or, use the below to set a default value for 'key' if it doesn't exist
       the_value = shared_obj.get('key','default')
     # etc.
于 2012-09-06T17:09:18.237 に答える