我为在我的电子商务网站中搜索一个产品做了一个简单的视图。
在我想将搜索到的参数(使用创建查询集)保存在特定模型中以获取搜索历史记录之后,视图(API)等待 GET 参数(如http://example.com/search/12345 )。
但是,如果我从上一个 Firefox 版本调用视图/api,我会在数据库中获得两条记录,而 Edge 中只有一条。
深化主题的问题是 HTTP RFC on Get 方法所期望的幂等性。有些浏览器可以做不止一个请求...
我需要为搜索 api 保留 GET 方法,但我需要保存搜索到的字符串。
我可以使用 GET 参数进行搜索并将其保存在数据库中吗?没有 CSRF/Cookie/用户代理?
为了更好地理解代码非常简化:
# 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 ... :-)')