摘要:今天在修改之前做的一個搜索接口雖然使用了但是由于需要修改請求參數(shù)和響應(yīng)數(shù)據(jù)格式所以大費周折調(diào)試了老一會兒問題是這樣的大家如果有好的點子可以留言哦默認的請求接口為搜索關(guān)鍵字我設(shè)計的接口搜索關(guān)鍵字搜索類型我們的項目分為搜索全部及類型搜索所以像默
今天在修改之前做的一個搜索接口,雖然使用了haystack,但是由于需要修改請求參數(shù)和響應(yīng)數(shù)據(jù)格式,所以大費周折調(diào)試了老一會兒,問題是這樣的,大家如果有好的點子可以留言哦:
haystack默認的請求接口為.../search?q=搜索關(guān)鍵字&models=xxxx.xxxx&models=xxxx.xxxx我設(shè)計的接口
.../search?q=搜索關(guān)鍵字&f=搜索類型
我們的項目分為搜索全部及類型搜索,所以像默認的接口太暴露,所以我設(shè)計的短小干練了點,但是怎樣去實現(xiàn),看源碼我實現(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
但是問題來了,多個model搜索怎樣實現(xiàn)?我反正首先是進行照葫蘆畫瓢:
models = { 0: "xxx.xxxxx", 1: "xx.xxxxx", 2: "xxxxxx.xxxxxxxxx", 9: "xxx.xxxx&xx.xxxxx&xxxxxx.xxxxxxxxx" }
結(jié)果是這樣的:
而正確的應(yīng)該是這樣的:
原來models需要的是一個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?什么鬼
原來此時的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的作用呢?大家認為的緩存應(yīng)該都是用redis或這mongoDB這種數(shù)據(jù)庫吧,如果你已經(jīng)從事開發(fā)很長時間,請一定要去看這個東西:曾經(jīng)我也寫過一篇文章,今天拿出來,有需要的可以點開https://segmentfault.com/a/11...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/44101.html
摘要:可以看到,雖然是同樣的請求數(shù)據(jù),在不同的階段和不同組件看來,是完全不同的形式。請求還有一個不那么明顯的特性它不能被應(yīng)用修改,應(yīng)用只能讀取請求的數(shù)據(jù)。 這是 flask 源碼解析系列文章的其中一篇,本系列所有文章列表: flask 源碼解析:簡介 flask 源碼解析:應(yīng)用啟動流程 flask 源碼解析:路由 flask 源碼解析:上下文 flask 源碼解析:請求 flask 源碼解...
摘要:文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群網(wǎng)站數(shù)據(jù)庫訪問優(yōu)化的數(shù)據(jù)庫層提供了很多方法來幫助開發(fā)者充分的利用他們的數(shù)據(jù)庫。使用標準數(shù)據(jù)庫優(yōu)化技巧包括索引。整體插入創(chuàng)建對象時,盡可能使用來減少查詢的數(shù)量。 Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。 交流群:467338606 網(wǎng)站:http://...
摘要:更多描述可見文檔這種惰性求值的方法在很多模塊中都會使用,比如中的使用上與例子一致,如表單中的討論在大部分情況下,讓屬性具有惰性求值能力的全部意義就在于提升程序性能。當不需要這個屬性時就能避免進行無意義的計算,同時又能阻止該屬性重復(fù)進行計算。 起步 我們希望將一個只讀的屬性定義為 property 屬性方法,只有在訪問它時才進行計算,但是,又希望把計算出的值緩存起來,不要每次訪問它時都重...
閱讀 1115·2021-11-16 11:42
閱讀 2895·2021-10-12 10:18
閱讀 2854·2021-09-24 09:48
閱讀 3457·2019-08-30 15:56
閱讀 1523·2019-08-30 14:17
閱讀 3036·2019-08-29 12:14
閱讀 902·2019-08-27 10:51
閱讀 2020·2019-08-26 13:28