潭州课堂25班:Ph201805201 django 项目 第二十七课 docker简介,配置文件 (课堂笔记)
新闻搜索功能实现
一、docker介绍
1.什么是docker?
使用容器让创建、部署、运行应用程序更简单的一个工具
让应用所需的库和依赖环境打包
有一点点像虚拟机
2.为什么使用docker?
3.docker vs vmware(or virtualbox)?
4.docker 架构
Docker platform
Docker Engine
a server process
a client cli
a rest api interface
Docker architecture
Docker client
Docker daemon
Docker registries
Docker objects
Images
Containers
Services
Docker Hub
5.安装docker
见官网,略
6.创建Dockerfile案例



#This is a sample image
FROM ubuntu
LABEL maintainer="admin@youkou.site"
RUN apt-get update
RUN apt-get install –y nginx
CMD ["echo", "Hello World!"]
二、新闻搜索功能实现
1.需求分析
可以使用数据库的模糊查询(like关键字)来实现,但效率极低
# 模糊查询
# like
# %表示任意多个任意字符
# _表示一个任意字符
SELECT *
FROM users
WHERE username LIKE '%python%' AND is_delete = 0;
在多个字段中查询,使用like关键字不方便
因此使用搜索引擎来实现全文检索
2.搜索引擎原理
搜索引擎并不是直接在数据库中进行查询
会对数据库中的数据进行一遍预处理,单独建立一份索引结构数据
类似字典的索引检索页
3.Elasticsearch
开源
搜索引擎首选
底层是开源库Lucene
REST API 的操作接口
搜索引擎在对数据构建索引时,需要进行分词处理。分词是指将一句话拆解成多个单字或词,这些字或词便是这句话的关键词。Elasticsearch 不支持对中文进行分词建立索引,需要配合扩展elasticsearch-analysis-ik来实现中文分词处理。

4.使用docker安装elasticsearch
a.获取镜像
# 拉取镜像到本地仓库
docker image pull delron/elasticsearch-ik:2.4.6-1.0
# 查看本地仓库是否有这个镜像
docker images
或docker image ls
b.将百度云盘中的elasticsearch.zip文件传到虚拟机中的家目录,然后unzip解压。在虚拟机中的elasticsearch/config/elasticsearch.yml第54行,更改ip地址为0.0.0.0,端口改为8002,默认端口为9200



# 在xshell中使用rz命令将elasticsearch.zip文件传到虚拟机的家目录中
#然后在家目录中解压
unzip elasticsearch.zip
cd ~/elasticsearch/config
# network.host: 172.18.168.123
network.host: 0.0.0.0
#
# Set a custom port for HTTP:
#
http.port: 8002
c.创建docker容器并运行
# 根据拉取到本地的镜像创建容器,需要将/home/bd/elasticsearch/config配置文件所在目录修改为你自己的路径
不行就加 sudo
docker run -dti --network=host --name=elasticsearch -v /home/binbin/elasticsearch/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
# 查看是否创建成功
docker container ls -a
# 如果STATUS为Up则创建容器成功
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b254fe1ee0eb delron/elasticsearch-ik:2.4.6-1.0 "/docker-entrypoint.…" 3 days ago Up 3 days elasticsearch
# 运行如下命令,如果有显示则elasticsearch配置成功
curl 127.0.0.1:8002
d.进入项目虚拟环境中,安装相关包
# 进入项目虚拟环境
workon myblog_env
pip install django-haystack
pip install elasticsearch==2.4.1
e.在settings.py文件中加入如下配置:
INSTALLED_APPS = [
'haystack',
]
ELASTICSEARCH_DSL = {
'default': {
'hosts': '127.0.0.1:8002'
},
}
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:8002/', # 此处为elasticsearch运行的服务器ip地址,端口号默认为9200
'INDEX_NAME': 'dj_pre_class', # 指定elasticsearch建立的索引库的名称
},
}
# 设置每页显示的数据量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
# 当数据库改变时,会自动更新索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
5.后端功能实现
# 在apps/news/search_indexes.py中创建如下类:(名称固定为search_indexes.py)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
@Time : 2018/12/23 11:22 AM
@Auth : Youkou
@Site : www.youkou.site
@File : search_indexes.py.py
@IDE : PyCharm
@Edit : 2018/12/23
-------------------------------------------------
"""
from haystack import indexes
# from haystack import site
from .models import News
class NewsIndex(indexes.SearchIndex, indexes.Indexable):
"""
News索引数据模型类
"""
text = indexes.CharField(document=True, use_template=True)
id = indexes.IntegerField(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')
# comments = indexes.IntegerField(model_attr='comments')
def get_model(self):
"""返回建立索引的模型类
"""
return News
def index_queryset(self, using=None):
"""返回要建立索引的数据查询集
"""
return self.get_model().objects.filter(is_delete=False, tag_id=1)
from haystack.views import SearchView as _SearchView
class SearchView(_SearchView):
# 模版文件
template = 'news/search.html'
# 重写响应方式,如果请求参数q为空,返回模型News的热门新闻数据,否则根据参数q搜索相关数据
def create_response(self):
kw = self.request.GET.get('q', '')
if not kw:
show_all = True
hot_news = models.HotNews.objects.select_related('news'). \
only('news__title', 'news__image_url', 'news__id'). \
filter(is_delete=False).order_by('priority', '-news__clicks')
paginator = Paginator(hot_news, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE)
try:
page = paginator.page(int(self.request.GET.get('page', 1)))
except PageNotAnInteger:
# 如果参数page的数据类型不是整型,则返回第一页数据
page = paginator.page(1)
except EmptyPage:
# 用户访问的页数大于实际页数,则返回最后一页的数据
page = paginator.page(paginator.num_pages)
return render(self.request, self.template, locals())
else:
show_all = False
qs = super(SearchView, self).create_response()
return qs
# 创建templates/search/indexes/news/news_text.txt文件(文件名为:应用名_text.txt)
{{ object.title }}
{{ object.digest }}
{{ object.content }}
# 在apps/news/urls.py中
urlpatterns = [
path('search/', views.SearchView(), name='search'),
]
# 在虚拟机中执行如下命令,生成索引
python manage.py rebuild_index
6.前端功能实现
<!-- 在templates/news1/search.html中加入如下代码: -->
<div class="main-contain ">
<!-- search-box start -->
<div class="search-box">
<form action="" style="display: inline-flex;">
<input type="search" placeholder="请输入要搜索的内容" name="q" class="search-control">
<input type="submit" value="搜索" class="search-btn">
</form>
<!-- 可以用浮动 垂直对齐 以及 flex -->
</div>
<!-- search-box end -->
<!-- content start -->
<div class="content">
<!-- search-list start -->
{% if not show_all %}
<div class="search-result-list">
<h2 class="search-result-title">
搜索结果 <span style="font-weight: 700;color: #ff6620;">{{ paginator.num_pages }}</span>页
</h2>
<ul class="news-list">
{# 导入自带高亮功能 #}
{% load highlight %}
{% for one_news in page.object_list %}
<li class="news-item clearfix">
<a href="{% url 'news1:news_detail' one_news.id %}" class="news-thumbnail" target="_blank">
<img src="{{ one_news.object.image_url }}">
</a>
<div class="news-content">
<h4 class="news-title">
<a href="{% url 'news1:news_detail' one_news.id %}">
{% highlight one_news.title with query %}
</a>
</h4>
<p class="news-details">{{ one_news.digest }}</p>
<div class="news-other">
<span class="news-type">{{ one_news.object.tag.name }}</span>
<span class="news-time">{{ one_news.object.update_time }}</span>
<span
class="news-author">{% highlight one_news.object.author.username with query %}
</span>
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
{% else %}
<div class="news-contain">
<div class="hot-recommend-list">
<h2 class="hot-recommend-title">热门推荐</h2>
<ul class="news-list">
{% for one_hotnews in page.object_list %}
<li class="news-item clearfix">
<a href="#" class="news-thumbnail">
<img src="{{ one_hotnews.news.image_url }}">
</a>
<div class="news-content">
<h4 class="news-title">
<a href="{% url 'news1:news_detail' one_hotnews.news.id %}">{{ one_hotnews.news.title }}</a>
</h4>
<p class="news-details">{{ one_hotnews.news.digest }}</p>
<div class="news-other">
<span class="news-type">{{ one_hotnews.news.tag.name }}</span>
<span class="news-time">{{ one_hotnews.update_time }}</span>
<span class="news-author">{{ one_hotnews.news.author.username }}</span>
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
<!-- search-list end -->
<!-- news-contain start -->
{# 分页导航 #}
<div class="page-box" id="pages">
<div class="pagebar" id="pageBar">
<a class="a1">{{ page.paginator.count }}条</a>
{# 上一页的URL地址 #}
{% if page.has_previous %}
{% if query %}
<a href="{% url 'news1:search' %}?q={{ query }}&page={{ page.previous_page_number }}"
class="prev">上一页</a>
{% else %}
<a href="{% url 'news1:search' %}?page={{ page.previous_page_number }}" class="prev">上一页</a>
{% endif %}
{% endif %}
{# 列出所有的URL地址 #}
{% for num in page.paginator.page_range|slice:":10" %}
{% if num == page.number %}
<span class="sel">{{ page.number }}</span>
{% else %}
{% if query %}
<a href="{% url 'news1:search' %}?q={{ query }}&page={{ num }}"
target="_self">{{ num }}</a>
{% else %}
<a href="{% url 'news1:search' %}?page={{ num }}" target="_self">{{ num }}</a>
{% endif %}
{% endif %}
{% endfor %}
{# 如果页数大于10,则打两点 #}
{% if page.paginator.num_pages > 10 %}
..
{% if query %}
<a href="{% url 'news1:search' %}?q={{ query }}&page={{ page.paginator.num_pages }}"
target="_self">{{ page.paginator.num_pages }}</a>
{% else %}
<a href="{% url 'news1:search' %}?page={{ page.paginator.num_pages }}"
target="_self">{{ page.paginator.num_pages }}</a>
{% endif %}
{% endif %}
{# 下一页的URL地址 #}
{% if page.has_next %}
{% if query %}
<a href="{% url 'news1:search' %}?q={{ query }}&page={{ page.next_page_number }}"
class="next">下一页</a>
{% else %}
<a href="{% url 'news1:search' %}?page={{ page.next_page_number }}" class="next">下一页</a>
{% endif %}
{% endif %}
</div>
</div>
<!-- news-contain end -->
</div>
<!-- content end -->
</div>
/* 在static/css/news/search.css中加入如下代码: */
/* === current index start === */
#pages {
padding: 32px 0 10px;
}
.page-box {
text-align: center;
/*font-size: 14px;*/
}
#pages a.prev, a.next {
width: 56px;
padding: 0
}
#pages a {
display: inline-block;
height: 26px;
line-height: 26px;
background: #fff;
border: 1px solid #e3e3e3;
text-align: center;
color: #333;
padding: 0 10px
}
#pages .sel {
display: inline-block;
height: 26px;
line-height: 26px;
background: #0093E9;
border: 1px solid #0093E9;
color: #fff;
text-align: center;
padding: 0 10px
}
/* === current index end === */
潭州课堂25班:Ph201805201 django 项目 第二十七课 docker简介,配置文件 (课堂笔记)的更多相关文章
- 潭州课堂25班:Ph201805201 django 项目 第二十课 数据库分析设计图 (课堂笔记)
https://www.dbdesigner.net/
- 潭州课堂25班:Ph201805201 django 项目 第二十一课 文章主页 新闻列表页面功能 (课堂笔记)
新闻列表页功能 1.分析 业务处理流程: 判断前端传的标签分类id是否为空,是否为整数.是否超过范围 判断前端传的当前文章页数是否为空,是否为整数.是否超过范围 请求方法:GET url定义:/new ...
- 潭州课堂25班:Ph201805201 django 项目 第十七课 用户登录,登出实现 (课堂笔记)
登录,校验: 1,判断用户名输入是否为空, 2,判断用户名密码是否匹配, 3,记住我的功能,:将用户信息记到 session 中 请求方式: POST 在视图中: # 1,创建类# 2,获取前台参数# ...
- 潭州课堂25班:Ph201805201 django 项目 第二十三课 文章主页 轮播图前端实现 热门新闻推荐实现 详情页实现 (课堂笔记)
前台代码 // 在static/js/news/index.js文件中 $(function () { // 新闻列表功能 let $newsLi = $(".news-nav ul li& ...
- 潭州课堂25班:Ph201805201 django 项目 第五课 静态页面转为模板 (课堂笔记)
一.分析静态页面 1.静态vs动态 条目 静态页面 动态页面 网站内容 固定不变 经常变动 浏览器加载速度 更快(无需向服务器发起请求) 更慢 改变网站内容 很难(修改或者创建新的html页面) ...
- 潭州课堂25班:Ph201805201 django 项目 第十课 自定义错误码,完成图片验证码,用户是否被注册功能 (课堂笔记)
把 视图传到前台的 JsonResponse(data=data) 先进行处理,之后再传到前台, 处理:引用自定义错误代码,把错误代码返回给前台,前台根据错误代码中文提示 class Code: O ...
- 潭州课堂25班:Ph201805201 django 项目 第七课 用户模型设计 (课堂笔记
在 user 的应用中的 models.py: 导入 dango 自带的用户模型 from django.contrib.auth.models import AbstractUser,UserMan ...
- 潭州课堂25班:Ph201805201 django 项目 第四课 项目搭建 课堂笔记)
创建一用户,授予对这个 myblog 库的所有表的权限(.*),在任何 ip 地址中访问(@“%”), 刷新: 退出,用新创建的用户登录,并进入这个库, 在昨天创建的项目中,配置文件中 为了数据库的案 ...
- 潭州课堂25班:Ph201805201 django 项目 第三课 码云注册,django项目 (课堂笔记)
d码云注册,登录, 创建项目: 生成秘钥 想看秘钥: 添加公钥 复制 ssh 连接 通过 git clone <ssh> 连接 在服务器上创建 python3 虚拟环境, 创建项目 p ...
随机推荐
- 改变html结构可以实现优先加载
我们通过一个实例来看一下: 本编程题目,完成一个混合布局的编写吧!最终效果如下图: 任务 任务1:完成顶部(top).底部(foot)宽度自适应 任务2:中间分为2两栏,其中,左侧(left)宽度为2 ...
- linux下mysql源码安装
参考链接:http://blog.csdn.net/zqtsx/article/details/9378703 下载mysql安装包, 不会下载点这里 地址:ftp://mirror.switch.c ...
- ajax---获取XMLHttpReuquest 对象
ajax的异步和同步(Asynchronus Javascript and Xml) 同步:一个时间段只能干一件事:即按部就班,一件事一件事的做. 异步:相同的时间段做多件事,同时进行.依靠 XMLH ...
- iOS 测试之非代码获取 iPhone 型号及其他信息
首先 安装libimobiledevice和ideviceinstaller $ brew uninstall ideviceinstaller $ brew uninstall libimobile ...
- python pop方法
在两个地方见到了pop方法的使用,看起来是之前自己确实故略寡闻了. 在pandas的DataFrame中 import pandas as pd dataframe = pd.read_csv('ir ...
- Leetcode刷题第003天
一.只出现一次的数字 class Solution { public: int singleNumber(vector<int>& nums) { ; for (auto num ...
- gotty---用来作为k8s的web terminal,通过参数读取指定pod的日志输出
不要重复造轮子,我觉得这个方案比较适合现在的情况. 我们知道,如果手工查看k8s里指定pod的日志输出,一般的方案如下: kubectl logs -f -n [namespace] [pod] -c ...
- VSCode Vue文件格式化
参考文档:https://vuejs.github.io/vetur/formatting.html 自从将VSCode更新之后,vue文件的html格式化就失效了,而且vue文件中的js ,css格 ...
- zookeeper 学习 客户端Acl操作笔记
Acl = Access control list create /node2 node2data [zk: localhost:2181(CONNECTED) 14] addauth digest ...
- BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...



