我有一个 django 视图,允许用户从数据库中搜索和获取数据。数据库没有发生任何更改。我还意识到 csrf 令牌显示在 URL 中。我在网上搜索并了解到情况不应该如此,并且在发出GET
请求时我不应该包含 csrf 令牌,但我仍然不确定。这是我的代码:
看法:
class SearchResultsListView(ListView):
model = Processor
template_name = 'finder/search_results.html'
paginate_by = 10 # Number of results per page
def get_queryset(self):
query = self.request.GET.get("q")
return Processor.objects.filter(
Q(name__icontains=query) |
Q(standard_transaction_fee__icontains=query) |
Q(accepted_payment_methods__icontains=query) |
Q(available_merchant_countries__icontains=query) |
Q(supported_business_types__icontains=query) |
Q(basic_info__icontains=query) |
Q(restricted_prohibited_business__icontains=query)
)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['query'] = self.request.GET.get('q', '')
return context
HTML:
<div class="search-container-container">
<div class="search-results-container">
<!-- Top search bar -->
<div class="search-header">
<form action="{% url 'search_results' %}" method="GET" class="search-search-form">
{%csrf_token%}
<input
type="text"
name="q"
class="search-input"
placeholder="Search processors..."
value="{{ request.GET.q }}"
aria-label="Search"
>
<button type="submit" class="search-button">
Search
</button>
</form>
</div>
否,CSRF 令牌用于非安全方法 [mdn-doc] ,因此 DELETE 、 PATCH、POST 和 PUT。Django 仅检查这些方法的 CSRF,因为安全方法被认为没有副作用。
事实上,在[Django-doc]源代码 [GitHub]中,它始终被接受为 GET、HEAD、OPTIONS 和 TRACE 方法:
CsrfViewMiddleware
在 GET 请求上强制执行这一点也没有多大意义:如前所述,GET 请求不应该创建、更新或删除数据。