资讯专栏INFORMATION COLUMN

django中的@cached_property

codecraft / 716人阅读

摘要:今天在修改之前做的一个搜索接口虽然使用了但是由于需要修改请求参数和响应数据格式所以大费周折调试了老一会儿问题是这样的大家如果有好的点子可以留言哦默认的请求接口为搜索关键字我设计的接口搜索关键字搜索类型我们的项目分为搜索全部及类型搜索所以像默

今天在修改之前做的一个搜索接口,虽然使用了haystack,但是由于需要修改请求参数和响应数据格式,所以大费周折调试了老一会儿,问题是这样的,大家如果有好的点子可以留言哦:

haystack默认的请求接口为
.../search?q=搜索关键字&models=xxxx.xxxx&models=xxxx.xxxx
我设计的接口
.../search?q=搜索关键字&f=搜索类型

我们的项目分为搜索全部及类型搜索,所以像默认的接口太暴露,所以我设计的短小干练了点,但是怎样去实现,看源码我实现了第一版:

class KaokaoSearchView(SearchView):
    def __call__(self, request):
        type = int(request.GET.get("f", 0))

        models = {
            0: "xxx.xxxxx",
            1: "xx.xxxxx",
            2: "xxxxxx.xxxxxxxxx"
        }

        data = request.GET
        _mutable = data._mutable
        data._mutable = True
        data["models"] = models.get(type, "")
        data._mutable = _mutable
        self.request = request

但是问题来了,多个model搜索怎样实现?我反正首先是进行照葫芦画瓢:

models = {
            0: "xxx.xxxxx",
            1: "xx.xxxxx",
            2: "xxxxxx.xxxxxxxxx",
            9: "xxx.xxxx&xx.xxxxx&xxxxxx.xxxxxxxxx"
        }

结果是这样的:

而正确的应该是这样的:

原来models需要的是一个list,这好办

models = {
            0: "xxx.xxxxx",
            1: "xx.xxxxx",
            2: "xxxxxx.xxxxxxxxx",
            9: ["xxx.xxxx", "xx.xxxxx", "xxxxxx.xxxxxxxxx"]
        }

出现了这种情况:


list嵌套?该怎么办呢?继续我的小聪明

data["models"] = models.get(type, "")
data["models"] = data["models"][0][1] + data["models"][0][1] + data["models"][0][2]


acc?什么鬼
原来此时的models还没有形成list嵌套,而是一个上面定义的list,也就说明我们的操作在了嵌套之前,怎么解决呢?那就看Django请求的完整过程吧,看看啥时候操作了这个东西...

结果

在django源码中:WSGIRequest中GET操作了这个query_string,源码是这样的:

class WSGIRequest(http.HttpRequest):
    def __init__(self, environ):
        ...
    @cached_property
    def GET(self):
        # The WSGI spec says "QUERY_STRING" may be absent.
        raw_query_string = get_bytes_from_wsgi(self.environ, "QUERY_STRING", "")
        return http.QueryDict(raw_query_string, encoding=self._encoding)

这个QueryDict将请求路径中的"xxx.xxxx&xx.xxxxx&xxxxxx.xxxxxxxxx",变成了

那这样就好办了

models = {
            0: "models=xxx.xxxxx",
            1: "models=xx.xxxxx",
            2: "models=xxxxxx.xxxxxxxxx",
            9: "models=xxx.xxxx&models=xx.xxxxx&models=xxxxxx.xxxxxxxxx"
        }
data = request.GET
_mutable = data._mutable
data._mutable = True
data["models"] = http.QueryDict(models.get(type, ""))
data._mutable = _mutable
self.request = request

顺利解决!!!不知道大家看到在Django源码中的GET方法中有一个装饰器@cached_property,这是什么东西呢?

# 源码
class cached_property(object):
    """
    Decorator that converts a method with a single self argument into a
    property cached on the instance.

    Optional ``name`` argument allows you to make cached properties of other
    methods. (e.g.  url = cached_property(get_absolute_url, name="url") )
    """
    def __init__(self, func, name=None):
        self.func = func
        self.__doc__ = getattr(func, "__doc__")
        self.name = name or func.__name__

    def __get__(self, instance, cls=None):
        if instance is None:
            return self
        res = instance.__dict__[self.name] = self.func(instance)
        return res

这怎么起到cached的作用呢?大家认为的缓存应该都是用redis或这mongoDB这种数据库吧,如果你已经从事开发很长时间,请一定要去看这个东西:曾经我也写过一篇文章,今天拿出来,有需要的可以点开https://segmentfault.com/a/11...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44101.html

相关文章

  • flask 源码解析:请求

    摘要:可以看到,虽然是同样的请求数据,在不同的阶段和不同组件看来,是完全不同的形式。请求还有一个不那么明显的特性它不能被应用修改,应用只能读取请求的数据。 这是 flask 源码解析系列文章的其中一篇,本系列所有文章列表: flask 源码解析:简介 flask 源码解析:应用启动流程 flask 源码解析:路由 flask 源码解析:上下文 flask 源码解析:请求 flask 源码解...

    weizx 评论0 收藏0
  • django 1.8 官方文档翻译: 2-6-4 数据库访问优化

    摘要:文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群网站数据库访问优化的数据库层提供了很多方法来帮助开发者充分的利用他们的数据库。使用标准数据库优化技巧包括索引。整体插入创建对象时,尽可能使用来减少查询的数量。 Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。 交流群:467338606 网站:http://...

    Simon 评论0 收藏0
  • 让Python中类的属性具有惰性求值的能力

    摘要:更多描述可见文档这种惰性求值的方法在很多模块中都会使用,比如中的使用上与例子一致,如表单中的讨论在大部分情况下,让属性具有惰性求值能力的全部意义就在于提升程序性能。当不需要这个属性时就能避免进行无意义的计算,同时又能阻止该属性重复进行计算。 起步 我们希望将一个只读的属性定义为 property 属性方法,只有在访问它时才进行计算,但是,又希望把计算出的值缓存起来,不要每次访问它时都重...

    NervosNetwork 评论0 收藏0

发表评论

0条评论

codecraft

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<