国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

django中的@cached_property

codecraft / 852人閱讀

摘要:今天在修改之前做的一個搜索接口雖然使用了但是由于需要修改請求參數和響應數據格式所以大費周折調試了老一會兒問題是這樣的大家如果有好的點子可以留言哦默認的請求接口為搜索關鍵字我設計的接口搜索關鍵字搜索類型我們的項目分為搜索全部及類型搜索所以像默

今天在修改之前做的一個搜索接口,雖然使用了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...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/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元查看
<