0

ユーザー認証システムを備えたdjangoベースのWebサイトを持っています。一意でなければならない属性ファイル名を持つモデル (たとえば A) があります。Web ページの特定のボタンをクリックすると、Python ビューの 1 つが次のことを行います。

file=randomNameX()
a=A(filename=file) 
a.save()

def randomStringX(length):
    s = ''
    letters = "0123456789abcdefghijklmnopqrstuvwxyz"
    while len(s) < length:
    s += letters[random.randint(0, len(letters)-1)]
    return s

def randomNameX():
    name = randomString(10)
    while A.objects.filter(filename="_"+name).count() > 0:
    name = randomString(10)
    return name

2 人のユーザー (ユーザー 1 とユーザー 2) が同時に同じファイル名を生成し、最初にユーザー 1 に対してデータベース エントリが発生し、属性が一意であるため、ユーザー 2 に対して例外が発生する可能性はありますか?

はいの場合、これを克服する方法を教えてください。

4

1 に答える 1

0

あなたが説明することは、競合状態と呼ばれます( http://en.wikipedia.org/wiki/Race_condition )。

これが現在のコードで発生するかどうかは、「ランダムなファイル名を生成する」の実装に依存するため、答えを知ることができるのはあなただけですが、そのような問題を回避する最も簡単な方法は、UUID システムを使用することです ( http://fr .wikipedia.org/wiki/Universal_Unique_Identifier )、標準のソリューションまたは「独自のロール」ソリューションのいずれかです。

コンテキスト (HTTP 要求ハンドラー) を考えると、タイムスタンプ、要求クライアントの IP アドレス、およびいくつかのランダムなものの組み合わせで、このような衝突の可能性を大幅に減らすことができます。

于 2013-06-28T11:02:00.140 に答える