zoukankan      html  css  js  c++  java
  • 潭州课堂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 }}&amp;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 }}&amp;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 }}&amp;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 }}&amp;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 {
    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 === */

     

  • 相关阅读:
    hdu 1896 stones
    各种类型的取值范围
    RSS/PSS/VSZ
    kasan BUG log
    ARM机器码分析
    Linux进程状态
    谢宝友: 深入理解RCU之七:分级RCU实现
    rcu_preempt detected stalls on CPUs/tasks
    Linux 内核 hlist
    linux cmd
  • 原文地址:https://www.cnblogs.com/gdwz922/p/10183034.html
Copyright © 2011-2022 走看看