使用 Get 方法的 Django 视图为 API 从 Firefox 保存两次记录

Django view as API with Get method save twice records from Firefox

我做了一个简单的视图,用于在我的电子商务网站中搜索一种产品..

视图(API)等待 GET 参数(如 http://example.com/search/12345)后,我想将搜索到的参数(使用创建查询集)保存在特定模型中以获取搜索历史记录.

但是如果我从上一个 Firefox 版本调用 view/api,我在数据库中得到两条记录,而只有一条来自 Edge。

深化主题问题是 HTTP RFC 对 Get 方法的幂等性。 有些浏览器可以处理多个请求...

我需要保留 GET 方法进行搜索 api 但我需要保存搜索到的字符串。

我可以使用GET参数搜索并保存在数据库中吗?没有 CSRF/Cookie/User-Agent?

为了更好地理解代码非常简化:

# models.py
class SearchHistory(models.Model):

    searched_text = models.CharField(max_length=255)
    results_number = models.IntegerField(default='0')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f'{self.searched_text}'

    class Meta:
        verbose_name = "search term"
        verbose_name_plural = "history search terms"

#url.py
urlpatterns = [
      ...
      path('search/<str:search>', search, name='search'),
      ...
]

# views.py
def search(request, search):
    products = Product.objects.filter(name__contains=search)
    results_number = len(products) # I know a better way for this..
    SearchHistory.objects.create(searched_text=search, results_number=results_number)
    return HttpResponse('irrilevant ... :-)')

我解决了这个问题。 我的模板中有一个错误的 img 标签。

违规元素:

<img src="#" />

当 Firefox 在 DOM 中读取此元素时,重新加载页面。