使用 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 中读取此元素时,重新加载页面。
我做了一个简单的视图,用于在我的电子商务网站中搜索一种产品..
视图(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 中读取此元素时,重新加载页面。