Следует ли использовать тег шаблона csrf в форме поиска?
У меня есть представление на django, которое позволяет пользователю искать и получать данные из базы данных. Никаких изменений в базу данных не вносится. Я также понял, что токен csrf отображается в url. Я поискал в Интернете и прочитал, что этого не должно быть и что при запросах GET
я не должен включать токен csrf, но я все еще не уверен. Вот мой код:
view:
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 в форме поиска?
Нет, CSRF-токены используются для небезопасных методов [mdn-doc], таких как DELETE, PATCH, POST и PUT. Django проверяет CSRF только для этих методов, поскольку считается, что безопасные методы не имеют побочных эффектов.
Indeed, in the CsrfViewMiddleware
[Django-doc] source code [GitHub], it is always accepted for GET, HEAD, OPTIONS, and TRACE methods:
class CsrfViewMiddleware(MiddlewareMixin): # … def process_view(self, request, callback, callback_args, callback_kwargs): # … if request.method in ("GET", "HEAD", "OPTIONS", "TRACE"): return self._accept(request) # … # …
Также не имеет особого смысла применять это к GET-запросу: как уже говорилось, GET-запросы не должны создавать, обновлять или удалять данные.