0

私のジャンゴアプリでは、ユーザー名とファイル名の間のマッピングを作成する必要があります。ユーザーが特定のファイルを選択すると、プログラムはそのユーザー名とファイル名の間のマッピングを関連付けます。

Python辞書を使用するために、次のように試しました:

views.py
----------

uname_file_map ={}

def user_select_file(request):
    filename = get_filename_from_request()
    username = request.user.username
    uname_file_map[username] = filename
    ....

def do_some_file_ops(request):
   username = request.user.username
   process_file_contents(uname_file_map.get(username))
   ...

chrome and firefox2 つのブラウザ ( ) を使用し、2 つの異なるユーザーとしてログインし、2 つの異なるファイルを選択すると、問題なく動作します。私が疑問に思っているのは、多くのユーザーが同時にログインして異なるファイルを選択すると、同じ辞書インスタンスがすべて使用されるため、これが壊れるということです。

2 つのdatabaseテーブルUser with a filename_id fieldFilenameより良い解決策を使用していますか? それとも辞書で十分ですか?

4

2 に答える 2

2

2つのブラウザ(chromeとfirefox)を使用し、2人の異なるユーザーとしてログインし、2つの異なるファイルを選択すると、問題なく動作します。

s/動作する/動作するようです/

このコードをシングルスレッド/シングルプロセスサーバーで実行していて、プロセスが再起動されない限り、ユーザーごとに1つのファイルを使用する非永続的なマッピングが必要な場合は「一種の」動作になります。特定の時間に、どのファイルをいつでも処理するかは気にしません。

マルチスレッドまたはマルチプロセス環境にコードをデプロイするとすぐに、これは完全に機能しなくなります。

IOW:マーティンが言ったように、モデルを使用してください;)

于 2012-06-19T10:49:15.170 に答える
1

探しているものを実現するためにモデルを使用しませんか?

class FileMapping(models.Model):
    user = models.ForeignKey(User)
    file_name = models.CharField(_('filename'))


def user_select_file(request):
    filename = get_filename_from_request()
    fm = FileMapping(user=request.user, file_name=filename)
    ....

def do_some_file_ops(request):
   fm = FileMapping.objects.filter(user=request.user)
   process_file_contents(fm)

あなたが言及したように、同時実行などのいくつかのセキュリティ問題についてチェックする必要がある純粋なpythonソリューションを使用するよりも、「djangoフレンドリー」だと思います。

于 2012-06-19T09:55:06.037 に答える