亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

django中的@cached_property

codecraft / 955人閱讀

摘要:今天在修改之前做的一個(gè)搜索接口雖然使用了但是由于需要修改請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)格式所以大費(fèi)周折調(diào)試了老一會(huì)兒?jiǎn)栴}是這樣的大家如果有好的點(diǎn)子可以留言哦默認(rèn)的請(qǐng)求接口為搜索關(guān)鍵字我設(shè)計(jì)的接口搜索關(guān)鍵字搜索類型我們的項(xiàng)目分為搜索全部及類型搜索所以像默

今天在修改之前做的一個(gè)搜索接口,雖然使用了haystack,但是由于需要修改請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)格式,所以大費(fèi)周折調(diào)試了老一會(huì)兒,問題是這樣的,大家如果有好的點(diǎn)子可以留言哦:

haystack默認(rèn)的請(qǐng)求接口為
.../search?q=搜索關(guān)鍵字&models=xxxx.xxxx&models=xxxx.xxxx
我設(shè)計(jì)的接口
.../search?q=搜索關(guān)鍵字&f=搜索類型

我們的項(xiàng)目分為搜索全部及類型搜索,所以像默認(rèn)的接口太暴露,所以我設(shè)計(jì)的短小干練了點(diǎn),但是怎樣去實(shí)現(xiàn),看源碼我實(shí)現(xiàn)了第一版:

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

但是問題來(lái)了,多個(gè)model搜索怎樣實(shí)現(xiàn)?我反正首先是進(jìn)行照葫蘆畫瓢:

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

結(jié)果是這樣的:

而正確的應(yīng)該是這樣的:

原來(lái)models需要的是一個(gè)list,這好辦

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

出現(xiàn)了這種情況:


list嵌套?該怎么辦呢?繼續(xù)我的小聰明

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


acc?什么鬼
原來(lái)此時(shí)的models還沒有形成list嵌套,而是一個(gè)上面定義的list,也就說(shuō)明我們的操作在了嵌套之前,怎么解決呢?那就看Django請(qǐng)求的完整過(guò)程吧,看看啥時(shí)候操作了這個(gè)東西...

結(jié)果

在django源碼中:WSGIRequest中GET操作了這個(gè)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)

這個(gè)QueryDict將請(qǐng)求路徑中的"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方法中有一個(gè)裝飾器@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的作用呢?大家認(rèn)為的緩存應(yīng)該都是用redis或這mongoDB這種數(shù)據(jù)庫(kù)吧,如果你已經(jīng)從事開發(fā)很長(zhǎng)時(shí)間,請(qǐng)一定要去看這個(gè)東西:曾經(jīng)我也寫過(guò)一篇文章,今天拿出來(lái),有需要的可以點(diǎn)開https://segmentfault.com/a/11...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/44101.html

相關(guān)文章

  • flask 源碼解析:請(qǐng)求

    摘要:可以看到,雖然是同樣的請(qǐng)求數(shù)據(jù),在不同的階段和不同組件看來(lái),是完全不同的形式。請(qǐng)求還有一個(gè)不那么明顯的特性它不能被應(yīng)用修改,應(yīng)用只能讀取請(qǐng)求的數(shù)據(jù)。 這是 flask 源碼解析系列文章的其中一篇,本系列所有文章列表: flask 源碼解析:簡(jiǎn)介 flask 源碼解析:應(yīng)用啟動(dòng)流程 flask 源碼解析:路由 flask 源碼解析:上下文 flask 源碼解析:請(qǐng)求 flask 源碼解...

    weizx 評(píng)論0 收藏0
  • django 1.8 官方文檔翻譯: 2-6-4 數(shù)據(jù)庫(kù)訪問優(yōu)化

    摘要:文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群網(wǎng)站數(shù)據(jù)庫(kù)訪問優(yōu)化的數(shù)據(jù)庫(kù)層提供了很多方法來(lái)幫助開發(fā)者充分的利用他們的數(shù)據(jù)庫(kù)。使用標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)優(yōu)化技巧包括索引。整體插入創(chuàng)建對(duì)象時(shí),盡可能使用來(lái)減少查詢的數(shù)量。 Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。 交流群:467338606 網(wǎng)站:http://...

    Simon 評(píng)論0 收藏0
  • 讓Python中類的屬性具有惰性求值的能力

    摘要:更多描述可見文檔這種惰性求值的方法在很多模塊中都會(huì)使用,比如中的使用上與例子一致,如表單中的討論在大部分情況下,讓屬性具有惰性求值能力的全部意義就在于提升程序性能。當(dāng)不需要這個(gè)屬性時(shí)就能避免進(jìn)行無(wú)意義的計(jì)算,同時(shí)又能阻止該屬性重復(fù)進(jìn)行計(jì)算。 起步 我們希望將一個(gè)只讀的屬性定義為 property 屬性方法,只有在訪問它時(shí)才進(jìn)行計(jì)算,但是,又希望把計(jì)算出的值緩存起來(lái),不要每次訪問它時(shí)都重...

    NervosNetwork 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<