一次只允许一个用户登陆页面

时间:2019-05-09 10:46:04

标签: django

我正在构建一个应用程序,用户可以在其中浏览Treasure对象的页面。

每个藏宝页面都有一个Next按钮,可以访问下一个可用的藏宝,并按数据库上的ID进行排序。

我要只允许一个用户登陆特定的藏宝页。用户到达页面后,Treasure实例将由该用户(treasure.captured_by = user)拥有。

因此,Next按钮应返回从未被其他用户捕获的宝藏页面。不幸的是,当连接了许多用户时,有时会发生两个用户登陆同一宝藏页面的情况。我该如何解决?

示例:

  • 用户A在页面treasures/1
  • 用户B在页面treasures/2
  • 两个用户都在同一确切时间点击了Next
  • 我想要的内容:两个用户之一进入treasures/3,另一个进入treasures/4
  • 现实情况:两个用户都被重定向到treasures/3,这是不正确的。

该按钮将调用一个视图,其功能类似于:

def get_next_available_treasure(request, current_treasure_id):
    """Retrieve the next unclaimed treasure."""

    treasure = Treasure.objects.filter(
        id__gt=current_treasure_id,  # Only consider Treasures that have been stored later on the db
        captured_by__isnull=True
    ).order_by('id').first()

    return redirect('treasure-page', treasure_id=treasure.id)

urls.py中:

url(r'^go-to-next/(?P<current_treasure_id>\d+)/$',
    views.go_to_next_available_treasure,
    name='next-treasure'),

在模板中:

<a href="{% url 'textool:next-treasure' treasure.pk %}">Next</a>

问题:如何解决此问题并在宝藏页面/实例上进行某种“锁定”?


随机化顺序

我考虑过当用户单击Next时随机分配宝物的顺序。这样可以减少两个用户登陆同一页面的可能性。但是,我不能这样做,因为我需要保持宝物的顺序。

0 个答案:

没有答案