日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Django项目知识点(五)

發(fā)布時(shí)間:2024/10/8 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django项目知识点(五) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

微信原文: https://mp.weixin.qq.com/s/zpdb0LA9Qo5sxdX6uyLJwQ

搜索

談搜索,不得不提es,全名 Elasticsearch。

自行實(shí)現(xiàn)django框架和全文檢索引擎的代碼比較麻煩,抱著不重復(fù)造輪子的原則。

選用django的第三方包djangohaystack。它支持多種全文檢索引擎,本項(xiàng)目選擇最流行的全文檢索引擎之一elasticsearch。

安裝elasticsearch很艱難,推薦使用docker,不要安裝windows,會(huì)強(qiáng)制下載VirtualBox會(huì)與vm沖突的

docker

什么是docker?

簡(jiǎn)化創(chuàng)建,部署,運(yùn)行應(yīng)用程序的一個(gè)工具
打包應(yīng)用程序所需的庫(kù)和依賴環(huán)境
精簡(jiǎn)的虛擬機(jī)
docker vs 虛擬機(jī)

安裝

https://docs.docker.com/install/

版本 ce和ee
Docker Engine改為Docker CE(社區(qū)版)

Docker Data Center改為Docker EE(企業(yè)版)

下面是ubuntu下安裝(來(lái)源官網(wǎng))

如果是第一次安裝,你需要先添加docker的源然后再安裝

更新包
$ sudo apt-get update
安裝證書(shū)
$ sudo apt-get install
apt-transport-https
ca-certificates
curl
gnupg-agent
software-properties-common
添加docker的官方GPGkey
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
添加docker源
$ sudo add-apt-repository
“deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable”
安裝 docker ce

更新包索引
$ sudo apt-get update
安裝docker
$ sudo apt-get install docker-ce
檢測(cè)是否安裝成功
$ sudo docker run hello-world
安裝成功會(huì)出現(xiàn)如下輸出:Hello from Docker!

先鏡像加速,不然你會(huì)懷疑人生的

編輯文件/etc/docker/daemon.json,沒(méi)有就新建。加入以下項(xiàng)目

下面的源可以改掉

{
“registry-mirrors”: [“https://registry.docker-cn.com”,“http://hub-mirror.c.163.com”]
}

{
“registry-mirrors”: [“https://nelhtz00.mirror.aliyuncs.com”]
}
鏡像和容器的概念

就像類和實(shí)例的類,鏡像就是類,容器就是對(duì)象

補(bǔ)充docker命令

去docker 官方下載
Shell docker pull :16.04

運(yùn)行鏡像文件。

docker run -i -t
docker run
docker run -p :
查看鏡像文件。

docker image ls
docker images
刪除鏡像文件。

docker rmi
docker rmi fce289e99eb9 -f
查看正在運(yùn)行容器。

docker ps
停止運(yùn)行的容器。

docker stop
docker stop
對(duì)于那些不會(huì)自動(dòng)終止的容器,就可以用下面的方式來(lái)停止。

docker container kill
吹了那些多docker,連es都沒(méi)吹

搜索功能環(huán)境搭建

docker的鏡像:https://hub.docker.com/

注意:因?yàn)閔aystack目前支持的elasticsearch版本為 1.x和2.x

所以這里選擇2.4.6

$ docker pull elasticsearch:2.4.6
但是外國(guó)人開(kāi)發(fā)的,所以安裝中文分詞插件elasticsearch-ik,不安裝分不了中文詞,搜不了中文

下載es-ik后,將其解壓到名為ik的文件夾

~$ unzip elasticsearch-analysis-ik-1.10.6.zip -d ./ik
ik所在文件下創(chuàng)建名為Dockerfile的文件,內(nèi)容如下

FROM elasticsearch:2.4.6
MAINTAINER Fisher “” 你下載docker注冊(cè)的郵箱 名字@郵箱
ADD ./ik/ /usr/share/elasticsearch/plugins/ik/
將Dockerfile同步在ubuntu

sudo docker build -t 你的名字/els-ik:2.4.6 .
運(yùn)行成功后,會(huì)在你的docker中創(chuàng)建一個(gè)新的鏡像叫做 你的名字/els-ik

最后運(yùn)行curl命令檢測(cè)es是否正常

~$ curl http://127.0.0.1:9200
{
“name” : “Shard”,
“cluster_name” : “elasticsearch”,
“cluster_uuid” : “Pq6BQQhTQN6q6ML6ThPlbw”,
“version” : {
“number” : “2.4.6”,
“build_hash” : “5376dca9f70f3abef96a77f4bb22720ace8240fd”,
“build_timestamp” : “2017-07-18T12:17:44Z”,
“build_snapshot” : false,
“l(fā)ucene_version” : “5.5.4”
},
“tagline” : “You Know, for Search”
}
djangohaystack

pip install django-haystack
settings.py
添加’haystack’

INSTALLED_APPS = [
# ‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘haystack’,
]
補(bǔ)充settings.py

HAYSTACK_CONNECTIONS = {
‘default’: {
‘ENGINE’: ‘haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine’,
‘URL’: ‘http://127.0.0.1:9200/’, # 此處為elasticsearch運(yùn)行的服務(wù)器ip地址和端口
‘INDEX_NAME’: ‘’, # 指定elasticserach建立的索引庫(kù)名稱
},
}

搜索結(jié)果每頁(yè)顯示數(shù)量

HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5

實(shí)時(shí)更新index

HAYSTACK_SIGNAL_PROCESSOR = ‘haystack.signals.RealtimeSignalProcessor’
haystack操作es還需要python的es驅(qū)動(dòng)。

官網(wǎng) :https://github.com/elastic/elasticsearch-py

pip install elasticsearch==2.4.1
至此,環(huán)境搭建完成。相對(duì)應(yīng)的es,es-ik,haystack,es-python的版本請(qǐng)保持一致。django支持2.x版本,es到了7.x版本

使用

下面代碼來(lái)源項(xiàng)目,無(wú)需看懂,知道怎么搞就可以了

在需要搜索的app,創(chuàng)建search_indexes.py文件

創(chuàng)建haystack數(shù)據(jù)模型

from haystack import indexes
from .models import News

class NewsIndex(indexes.SearchIndex, indexes.Indexable):
“”"
這個(gè)模型的作用類似django的模型,它告訴haystack哪些數(shù)據(jù)會(huì)被
放進(jìn)查詢回的模型對(duì)象中,以及通過(guò)哪些字段進(jìn)行索引和查詢
“”"
# 這字段必須這么寫(xiě),用來(lái)告訴haystack和搜索引擎要索引哪些字段
text = indexes.CharField(document=True, use_template=True)
id = indexes.CharField(model_attr=‘id’)
title = indexes.CharField(model_attr=‘title’)
digest = indexes.CharField(model_attr=‘digest’)
content = indexes.CharField(model_attr=‘content’)
image_url = indexes.CharField(model_attr=‘image_url’)

def get_model(self):"""返回建立索引的模型:return:"""return Newsdef index_queryset(self, using=None):"""返回要建立索引的數(shù)據(jù)查詢集:param using::return:"""return self.get_model().objects.filter(is_delete=False)

創(chuàng)建索引數(shù)據(jù)模板

在templates中創(chuàng)建文件search/indexes/yourappname/modelname_text.txt,所以本項(xiàng)目需要?jiǎng)?chuàng)建search/indexes/news/news_text.txt,文件內(nèi)容如下:
{{ object.title }}
{{ object.digest }}
{{ object.content }}
{{ object.author.username }}
創(chuàng)建索引

按上面的步驟配置好后,就可以運(yùn)行haystack的命令創(chuàng)建索引了

~$ python manage.py rebuild_index
視圖編寫(xiě)

from haystack.generic_views import SearchView

class NewsSearchView(SearchView):
“”"
新聞搜索視圖
“”"
# 設(shè)置搜索模板文件
template_name = ‘news/search.html’

# 重寫(xiě)get請(qǐng)求,如果請(qǐng)求參數(shù)q為空,返回模型News的熱門(mén)新聞數(shù)據(jù) # 否則根據(jù)參數(shù)q搜索相關(guān)數(shù)據(jù) def get(self, request, *args, **kwargs):query = request.GET.get('q')if not query:# 顯示熱門(mén)新聞hot_news = HotNews.objects.select_related('news__tag').only('news__title', 'news__image_url', 'news_id','news__tag__name').filter(is_delete=False).order_by('priority', '-news__clicks')paginator = Paginator(hot_news, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE)try:page = paginator.get_page(int(request.GET.get('page')))except Exception as e:page = paginator.get_page(1)return render(request, 'news/search.html', context={'page': page,'paginator': paginator,'query': query})else:# 搜索return super().get(request, *args, **kwargs)def get_context_data(self, *args, **kwargs):"""在context中添加page變量:param args: :param kwargs: :return: """context = super().get_context_data(*args, **kwargs)if context['page_obj']:context['page'] = context['page_obj']return context

路由

在news/urls.py中添加如下路由

path(‘news/search/’, views.NewsSearchView.as_view(), name=‘news_search’)

學(xué)不死,就往死里學(xué)。

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Django项目知识点(五)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。