如何阻止Django缓存视图结果

时间:2017-07-07 11:48:04

标签: django caching django-rest-framework

我是Django框架的新手。

我正在使用:

 python==2.7_win32
    Django==1.11.3
    djangorestframework==3.6.3

我正在创建一个不涉及任何数据库的API。

数据流程为:

  1. JSON中的用户请求

  2. 在Django的views.py

  3. 中调用方法
  4. 此方法调用我的本地包,该包不属于django 并获得结果

  5. 在响应

  6. 中返回此结果

    问题是: 它在第一个请求中完美运行,但在下一个请求中它只给出了之前的结果。

    我发现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应用了不同的值,我也得到相同的结果。 我检查了当地的包裹。我工作正常。问题只在于缓存。

1 个答案:

答案 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())