djangoの@cached_property

4043 ワード

今日は修正前に作った検索インタフェースですが、haystackを使っていますが、リクエストパラメータと応答データフォーマットを修正する必要があるので、長い間デバッグしていましたが、問題はこうです.良いアイデアがあればメッセージを残してください.
haystackのデフォルトのリクエストインタフェースは
.../search?q=     &models=xxxx.xxxx&models=xxxx.xxxx

私が設計したインタフェース
.../search?q=     &f=    

私たちのプロジェクトは検索のすべてとタイプの検索に分かれているので、デフォルトのインタフェースが露出しているので、私が設計した短い練習は少しできましたが、どのように実現するか、ソースコードを見て、私は第1版を実現しました.
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 = {
            0: 'xxx.xxxxx',
            1: 'xx.xxxxx',
            2: 'xxxxxx.xxxxxxxxx',
            9: ['xxx.xxxx', 'xx.xxxxx', 'xxxxxx.xxxxxxxxx']
        }

このような状況が発生しました.
リストネスト?どうしようかな?俺の頭の良さを続けろ
data['models'] = models.get(type, '')
data['models'] = data['models'][0][1] + data['models'][0][1] + data['models'][0][2]

acc?何の鬼がこの時のmodelsがまだリストネストを形成していないのか、上で定義したリストなのか、つまり私たちの操作がネストされる前に、どのように解決されたのかを説明しています.では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.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

それならやりやすい
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やmongodyというデータベースを使っているのではないでしょうか.もしあなたが長い間開発に従事していたら、ぜひこれを見てください.かつて私も文章を書いたことがありますが、今日出して、必要なものがあれば注文してください.https://segmentfault.com/a/11...