如何禁止通过 url 输入,如果它不是由项目"name"



我有一个控制复选框的小函数。当用户单击复选框时,此链接由{% url 'done'任务触发。pk %}。但是,如果您尝试在另一个选项卡中打开此链接,则复选框也会切换。
如何使用户能够通过值"name"跟踪链接,但是当他手动输入url时,会出现错误。嗯,或者有其他解决这个问题的方法。

模板代码
<div class="is__done__checkbox">
<form method="post" action="{% url 'done' task.pk %}">
{% csrf_token %}
<input type="checkbox" name="is_done" onchange="this.form.submit()" {% if task.is_done %} checked {% endif %}>
</form>
</div>

url

path('profile/<int:pk>/done/', done, name='done'),

视图

def done(request, pk):
task = Tasks.objects.get(pk=pk)
is_done = request.POST.get('is_done', False)
if is_done == 'on':
is_done = True
task.is_done = is_done
task.save()
return redirect(request.META.get('HTTP_REFERER'))

我试过了

def login_excluded(redirect_to):
def _method_wrapper(view_method):
def _arguments_wrapper(request, *args, **kwargs):
if request.user:
return HttpResponse(status=404)
return view_method(request, *args, **kwargs)
return _arguments_wrapper
return _method_wrapper
@login_excluded('/profile/<int:pk>/done/')
def done(request, pk):
task = Tasks.objects.get(pk=pk)
is_done = request.POST.get('is_done', False)
if is_done == 'on':
is_done = True
task.is_done = is_done
task.save()
return redirect(request.META.get('HTTP_REFERER'))

但是当用户点击复选框时出现了错误

但是如果您尝试在另一个选项卡中打开此链接,则复选框也会切换。

您的视图不阻止通过GET请求访问它。您可以使用@require_POST装饰<一口>[Django-doc]:

from django.views.decorators.http importrequire_POST

@login_excluded('/profile/<int:pk>/done/')
@require_POST
def done(request, pk):
task = Tasks.objects.get(pk=pk)
task.is_done = request.POST.get('is_done', False) == 'on'
task.save()
return redirect(request.META.get('HTTP_REFERER'))

注意:通常使用get_object_or_404(…)更好。<一口>[Django-doc] 一同晚餐,然后使用.get(…)<一口>[Django-doc]直接共舞。如果对象不存在,例如,由于用户自己更改了URL,get_object_or_404(…)将导致返回HTTP 404 Not Found响应,而使用.get(…)将导致HTTP 500服务器错误

你可以这样做,这样用户必须通过表单提交值:

def done(request, pk):
#check to see the page request is a submitted form
if request.method == "POST":
task = Tasks.objects.get(pk=pk)
is_done = request.POST.get('is_done', False)
if is_done == 'on':
is_done = True
task.is_done = is_done
task.save()
return redirect(request.META.get('HTTP_REFERER'))
else:
#If the user has just typed the URL (eg, method=="GET"), then do something else
return redirect('/formerror')

相关内容

最新更新