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
。这将降低两个用户登陆同一页面的可能性。但是,我不能这样做,因为我需要保持宝物的秩序。
解决方案
推荐阅读
- amazon-web-services - EC2 实例状态
- windows-10 - 如何在 Windows 10 计算机用户上以编程方式安装 Windows 10 Text To Speech Voices?
- dart - Flutter:构造函数中List参数的默认分配
- javascript - 如何使用 jsPdf 设置修剪框?
- android - Android Studio 说“ADB.exe 已过时并且存在严重的性能问题”,尽管 SDK 工具说一切都是最新的
- c - 如何避免重写不改变的文本片段
- javascript - 在存储操作中进行数据操作后同步提交 Vuex 突变
- database - 如何查找文档,哪个字段是特定字符串的子字符串?
- c# - DropdownList 值在 ASP.NET MVC 中为空
- python - Discord Bot 使用服务器授权(标头)