2017-07-21 11 views
0

私はいくつかの助けが必要です。ユーザー管理(アカウント作成、ログインなど)のための古典的な機能を備えたWebアプリケーションがあります。私の問題は、彼が接続(ログイン)したときに各ユーザのオブジェクト "UserObject"(直列化可能なオブジェクトではない)のインスタンスを作成しようとしていることです。このオブジェクトはいくつかのビューでユーザ要求を処理するために使用されるので、すべてのユーザーオブジェクト(辞書キーはユーザー名で、値は "UserObject"オブジェクト)を含むグローバルディクショナリ "users_objects"を持っているので、view.pyはこのように見えます:Apacheを使ったDjango:view.pyのグローバル変数

from user_object import UserObject 

users_objects = {} 

def login(request): 

    //login control and creation of session and context 
    ...... 
    ...... 
    global users_objects 
    user_name = request.session['name'] 
    users_objects[user_name] = UserObject() 
    return render(request, 'mySite/home.html', context) 

def request_view(request): 

    param = request.GET.get('parameter', None) 
    global users_objects 
    user_name = request.session['name'] 
    obj = users_objects[user_name] 
    res = obj.process(param) 
    return HttpResponse(str(res)) 

ジャンゴdevのサーバーでこのアプローチの作業罰金が、私は、実際の運用サーバー(Apacheの)グローバル辞書「users_objects」の内容が消えて、私は空の辞書を取得してジャンゴを設定します。してください、なぜ誰が知っていたのですか? djangoでグローバル辞書 を使用する最良の解決策は何ですか? ありがとうございました

答えて

1

これは、mod_wsgiが独自の変数空間を持つ複数のプロセスでアプリケーションを実行しているためです。

しかし、これを行う理由はありません。データはデータベースに保存され、グローバルオブジェクトには入れません。

+0

"UserObject"オブジェクトはシリアル化可能ではないオブジェクトです。さらに、新しい "UserObject"をインスタンス化すると、リモートサーバーへの接続が確立され、この接続を有効にしてユーザーの要求を処理する必要があります。だから私はデータベースにオブジェクトを格納することはできません –

+1

まあ、これは動作しません。マルチプロセス環境では、もともとオブジェクトを作成したのと同じプロセスを取得するという保証はありません。あなたは構造を再考する必要があります。おそらくデータをローカルデータベースに保存し、何かを処理する必要があるたびにリモートサーバーとの短期間の接続を確立する必要があります。 –

+1

ダニエルが説明しているように、短期間ではありますが、長期的な解決策ではありません。mod_wsgiのデーモンモードを確実に使用することです。それは1つのプロセスを使用します。デーモンモードも、デプロイメントの推奨メカニズムです。デフォルトの組み込みモードを使用すべきではありません。 http://blog.dscpl.com.au/2012/10/why-are-you-using-embedded-mode-of.html –

関連する問題