什么是@csrf_exempt
,我们为什么要在views.py
中使用它?此外,还有其他选择吗?
通常,当您通过表单提出请求时,您希望提交到视图的表单来自您的网站,而不是来自其他域。为了确保这种情况发生,您可以在表单中放置一个csrf令牌,以供视图识别。如果您将@csrf_exempt
添加到视图的顶部,那么您基本上就是在告诉视图它不需要令牌。这是一个安全豁免,你应该认真对待。
装饰器将视图标记为不受中间件确保的保护。示例:
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')
除非您知道确切的原因,否则不应该使用它。使用它的一个很好的例子是构建一个webhook,它将通过POST请求从另一个站点接收信息。然后,您必须能够接收数据,即使它没有csrf令牌,但将被另一个安全系统取代。例如,如果您对客户端的订阅使用stripe,则需要知道客户端是否取消订阅了他的帐户。网络挂钩将是通知您的网站的方式,然后切断未订阅客户端对您服务的访问。
@csrf_exempt是Django中的一个装饰器,Django是一个流行的Python web框架。它代表";跨站点请求伪造豁免;其目的是为views.py文件中的特定视图功能禁用内置的跨站点请求伪造(CSRF(保护。
CSRF是一种攻击类型,攻击者通过利用用户在不同网站上的已验证会话,诱骗用户执行他们不打算执行的操作。为了防止这种情况,Django默认包含CSRF保护。启用此保护后,Django会向模板中呈现的每个表单添加一个CSRF令牌。当用户提交表单时,令牌将与表单数据一起发送回服务器。然后,服务器验证令牌以确保请求源自同一网站。
但是,在某些情况下,您可能需要禁用某些视图的CSRF保护。如果您正在构建API,与不支持CSRF令牌的第三方服务集成,或者如果您有不需要CSRF保护的特定用例,则这可能是必要的。这就是@csrf_exempt发挥作用的地方。