我是Django框架的新手。
我正在使用:
python==2.7_win32
Django==1.11.3
djangorestframework==3.6.3
我正在创建一个不涉及任何数据库的API。
数据流程为:
JSON中的用户请求
在Django的views.py
此方法调用我的本地包,该包不属于django 并获得结果
在响应
问题是: 它在第一个请求中完美运行,但在下一个请求中它只给出了之前的结果。
我发现django缓存了Queryset
,我们可以通过添加all()
方法强制读取新数据。
但我的代码不涉及任何数据库或模型。所以我认为QuerySet也不会创建。但我的结果仍然以某种方式缓存。我怎么能阻止它?
以下是我的观点:
@api_view(['POST'])
@never_cache
def filter_details(request):
data = {}
data['data'] = {}
result_array = []
error = None
try:
attr1 = request.data.get("attr1")
attr2 = request.data.get("attr2")
local_package_obj = local_package.ClassName(attr1)
result_array = local_package_obj.get_some_data_as_array(attr2)
except Exception as e:
error = str(e)
data['data']['important'] = result_array
data['error'] = error
return Response(data)
即使为att1和attr2应用了不同的值,我也得到相同的结果。 我检查了当地的包裹。我工作正常。问题只在于缓存。
答案 0 :(得分:2)
我工作正常。问题只在于缓存。
不,它不能正常工作。 如果您遇到一些缓存问题,您可能在某处遇到了范围问题,而您却没有意识到这一点。
例如,如果您的模块中有类似的内容:
# This is a file
queryset = SomeModel.objects.all()
def my_function():
return list(queryset) # list() will force the QS evaluation
如果您致电my_function()
,它将返回实例列表。添加或删除某些实例,您将看不到更改。
原因是queryset
被评估一次并将继续评估。
如果您将代码更改为:
def my_function():
return list(queryset.all())
您会看到列表更改。这是因为.all()
将返回一个新的查询集,这意味着它不会被评估。
大多数时候,我更喜欢明确地直接从函数创建查询集:
def my_function():
return list(SomeModel.objects.all())