我如何允许用户在Django中每30分钟只能访问一次视图?

问题描述 投票:0回答:2

我正在构建一个允许用户更新网页的应用,但我希望限制任何用户每20-30分钟进行一次更新。我可以简单地将此逻辑添加到视图定义中吗?

@login_required
def update_options(request):
    ...
    # logic to determine how much time passed since the user visited
    ...
    return render(request, 'main/update-options.html')
python django django-views user-permissions time-limiting
2个回答
1
投票
from datetime import datetime def update_options(request): if request.session['last_access'] is None or (datetime.now() - request.session['last_access']).days * 24 * 60 > 30: 'YOUR CODE HERE' request.session['last_access'] = datetime.now() else: 'TOO MANY TRIES' return render(request, 'main/update-options.html')

0
投票
models.py

class Update(models.Model): update = models.IntegerField(null=True, blank=True) user = models.ForeignKey(User, on_delete=models.DO_NOTHING) date = models.DateTimeField(auto_now=True) # datetime of object creation next_allowed_update = models.DateTimeField( default=datetime.now()+timedelta(minutes=10)-timedelta(hours=5) # adjust for UTC ) location = models.CharField(max_length=30, default='none')

views.py

@login_required
def update_options(request):
    # user can only update once every 10 minutes : 10 set in model
    user_latest_update = Update.objects.filter(user=request.user).latest('id')
    current_time = datetime.now().replace(tzinfo=None)   
    next_allowed_update = user_latest_update.next_allowed_update.replace(tzinfo=None)

    remaining = str(next_allowed_update - current_time).split(':')
    minutes_remaining = int(remaining[1].lstrip("0")) + 1
    if current_time > next_allowed_update:
        return render(request, 'main/update-options.html')
    else:
        return render(request, 'main/update-denied.html', {'time_remaining': minutes_remaining})

模板

{% extends "main/base.html" %}

{% block content %}
<div class="container">
    <h1>You can update again in {{ time_remaining }} minute</h1>
</div>
{% endblock content %}

此解决方案还允许我渲染视图并传递一个值,以显示距离用户可以进行另一次更新为止的分钟数

© www.soinside.com 2019 - 2024. All rights reserved.