django:如何只允许来自表单的发帖请求?

时间:2019-07-12 10:56:24

标签: django

我有一个简单的表格:



{% block content %}
<p> Upload invoices </p>
  <form method="post" action="{% url 'upload_thing ' %}" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="invoice_thing">
    <button type="submit">Upload</button>
  </form>

我有看法


@require_POST
@transaction.atomic
def upload_thing(request): 
      ....

如何确保没有人可以通过curl或postman到达发布终点?

我希望只能通过单击表单按钮来访问终点。唯一可以执行此操作的人是管理员用户。

我如何做到这一点?

2 个答案:

答案 0 :(得分:1)

说实话,您不应阻止来自Django应用程序的curl或wget请求。可以通过反向代理服务器来完成,例如在NGINX中,您可以进行以下配置:

if ($http_user_agent ~* (wget|curl) ) {
   return 403;
}

尽管这不是一个适当的保护,但User-Agent信息可以被欺骗。可以在此serverfault答案中找到更多信息。

如果要阻止非管理员用户访问此页面,则可以对视图进行如下限制:

from django.core.exceptions import PermissionDenied
from django.contrib.auth.decorators import login_required


@login_required
@require_POST
@transaction.atomic
def upload_thing(request): 
      if not request.user.is_superuser:
        raise PermissionDenied()
      # rest of the code

答案 1 :(得分:0)

在python中执行此操作的正确方法是通过装饰器。

from django.contrib.auth.decorators import login_required, user_passes_test

@user_passes_test(lambda user: user.is_superuser)
def upload_thing(request):

通过这种方式,您可以限制方法而不是html页面。 因此,只有登录的管理员才能使用upload_thing(来自curl,邮递员或html表单)。