使用Flask+mysql开发一套自己的搜索引擎(附源码)

2023-11-20

使用Flask+mysql开发一套自己的搜索引擎(附源码)

前言

主要是针对在内网办公的朋友,可以把这一套部署到单机或者公司服务器,做一些名词查询、语言翻译的功能,如果需要的话可以扩展一下,搞成一套类似于内网网盘的软件,这个我们下期再讲,这期主要是一些最基本的结构,可用python的Flask架构在前端进行名词查询,通过查询mysql,然后显示出类似于百度百科的页面,话不多说,开搞。

一、创建Flask项目和相应的配置py文件

打开我们的开发工具Pycharm,然后左上角选择File,New Project,出现如下页面,选择Flask,命名为Search_Demo,然后点击Create。

在这里插入图片描述

刚创建的Flask项目目录树结构如下图所示,static主要是放前端的一些CSS、JS或者静态图片的,templates里是我们前端的html文件,app.py就是我们的主函数和启动程序:

在这里插入图片描述

当然,我们需要加一些配置的py文件进去,符合开发规范,不要全部放到一个py文件里去:

在这里插入图片描述

config.py主要是放置我们连接数据库的操作,包括数据库的信息和配置之类的。exts.py是我们对SQLAlchemy的配置。models.py里放我们建立的数据库内表的结构进行配置。这些下面会有详细的讲解。

二、连接数据库并建立表的结构

这里我们连的是mysql数据库,要确保计算机已经安装mysql,python有Pymysql插件,建议再下个navicat,在图形化界面上对mysql数据库进行一些更改与维护,这些东西的安装大家自行百度,网上资源还是很多的,基本没什么问题。

先对config.py进行编写,代码和解释如下:

HOSTNAME = '127.0.0.1' #数据库地址
PORT = '3306'          #端口号
DATABASE = 'search'    #数据库名称
USERNAME = 'root'      #用户名
PASSWORD = 'root'      #密码
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI  #用于连接的数据库URI
SQLALCHEMY_TRACK_MODIFICATIONS = True #设置为True,不然会报增加显著开销的错误

需要更改的是数据库地址、端口号、数据库名称、用户名和密码,根据自己建立的数据库进行相应的修改。

然后对exts.py进行编辑,代码和解释如下:

from flask_sqlalchemy import SQLAlchemy #导入SQLAlchemy包

db =SQLAlchemy()                        #创建数据库sqlalchemy工具对象

这里要先在你的python里下载sqlalchemy插件,可以在terminal里输入pip install sqlalchemy或者直接在pycharm里的Files→settings→Plugins里下载安装。

最后是在models里建立表,代码和解释如下:

from exts import db #从exts.py里导入数据库对象

class Search(db.Model):
    __tablename__ = 'Search_table'      #设置表名
    XH = db.Column(db.Integer,primary_key=True,autoincrement=True)  #第一列序号,整数型,自增
    MC = db.Column(db.String(200),nullable=False)                   #第二列名词,字符串型,200个字符以内,不可为空
    MCJX = db.Column(db.String(1000),nullable=False)                #第三列名词解析,字符串型,1000个字符以内,不可为空

表的结构就根据自己的自身情况去做修改,这里是一个最简单的例子。

三、编写前端与相应的函数

app.py里的代码

from flask import Flask,request,render_template # request是请求前端数据相关的包,render_template是路由映射相关的包
from flask_migrate import Migrate # 数据库迁移相关的包
import pymysql                    # 导入pymysql的目的是为之后用pyinstaller打包用的,不然会报错
import config                     # 数据库连接相关
from exts import db               # 导入数据库对象
from models import Search         # 导入建立的检索表

app = Flask(__name__,template_folder='./templates')
app.config.from_object(config)
#把app绑定到db上
db.init_app(app)
migrate =Migrate(app,db)

@app.route("/search",methods=["POST","GET"])         # 设置访问的域名,默认5000端口的化,访问检索页面就是127.0.0.1:5000/search
def search():
    if request.args.get('key_word',None) == None:    # 如果没有检测到关键字提交,就停留在检索页面
        print("未传参")
        return render_template("Search.html")        # 映射到检索页面
    else:                                            # 如果有关键词提交
        key_words = request.args.get('key_word')     # 将传来的关键词赋给key_word
        print(key_words)
        key_words=Search.query.filter_by(MC=key_words).all()  # 在表里查询符合条件的条目赋给key_words
        print(key_words)
        return render_template("Search_detail.html",key_words=key_words)  # 映射到类似与百度百科的页面,并将查询到的条目传过去 


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

在templates文件夹里创建检索页Search.html和检索详情页Search_detail.html

在这里插入图片描述

Search.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, target-densitydpi=device-dpi">
    <title>乐途同学检索</title>
</head>
<style type="text/css">
    .bg{
        background-image: url("../static/background.jpg");
        background-repeat: no-repeat;
        background-size:100% 100%;
        background-position: center;
        background-attachment: fixed;
    }

    * {
        box-sizing:border-box;
    }
    div.search {
        padding:10px 0;
    }
    form {
        position:relative;
        width:600px;
        margin:0 auto;
    }
    input,button {
        border:none;
        outline:none;
    }
    input {
        width:100%;
        height:42px;
        padding-left:13px;
    }
    button {
        height:42px;
        width:42px;
        cursor:pointer;
        position:absolute;
    }
    .bar input {
        border:2px solid #ec500b;
        border-radius:5px;
        background:transparent;
        top:0;
        right:0;
    }
    .bar button {
        background: #ec500b;
        border-radius:0 5px 5px 0;
        width:90px;
        top:0;
        right:0;
    }
    .bar button:before {
        content:"检索";
        font-size:13px;
        color:#F9F0DA;
    }
</style>
<body class="bg">
<div align="center"style="margin-top: 100px">
    <div><img src="../static/LOGO.png" ></div>
    <div style="margin-top: 20px"><img src="../static/标题.png"></div>
    <div class="search bar">
        <form action="{{ url_for('search') }}" method="get" >
            <p><input type="text" style="font-size: 20px" placeholder="请输入您想要查询的名词" name="key_word"></p>
            <button type="submit" ></button>
        </form>
    </div>
</div>
</body>
</html>

这里的背景,LOGO还有标题都是我自己做的一些图片,大家可以根据自己的情况去进行更换,放在static文件夹下,然后在代码里更改名称就可以了,呈现的页面如下:

在这里插入图片描述

Search_detail.html代码如下,效果在最后测试功能的时候呈现:

html lang="en">
<head>
    <meta charset="UTF-8">
    <title>检索详情</title>
</head>
<style type="text/css">
    .bg{
        background-image: url("../static/background.jpg");
        background-repeat: no-repeat;
        background-size:100% 100%;
        background-position: center;
        background-attachment: fixed;
    }
    .wk{
        border:2px solid #ec500b;
        border-radius:5px;
        background: aliceblue;
        height:500px ;
        width: 500px;
        align-content: center;
        margin: 0 auto;
        margin-top: 60px;
        background-color:rgba(0.1,0,0.1,0.2);

    }
    button{
        background-color:#ec500b;
        color:white;
        width: 300px;
        height: 47px;
        border:0;
        font-size: 16px;
        border-radius: 30px;
    }

</style>
<body class="bg">
    <div class="wk">
        <div>
        {% for key_word in key_words %}
            <div style="margin-top: 20px;font-size: 30px;color:#ec500b;font-weight: bolder ">检索词条:</div>
            <div style="margin-top:10px;font-weight: bolder;color: black;font-size:30px;margin-left: 65px">{{ key_word.MC }}</div>
            <div style="margin-top: 10px;font-size: 30px;color:#ec500b;font-weight: bolder ">词条解析:</div>
            <div style="font-size: 25px;font-weight: bold;text-indent: 50px;line-height: 40px"><p>{{ key_word.MCJX }}</p></div>
        {% endfor %}
        </div>
        <div style="text-align: center;margin-top: 170px" ><a href="Search"><button type="submit">确定</button></a></div>
    </div>>
</body>
</html>

四、效果测试

在这里插入图片描述

先点击左下角Terminal,打开命令行终端,然后依次输入以下代码,初始化数据库并创建表:

flask db init

flask db migrate

flask db upgrade

出现这个页面就算完成了

在这里插入图片描述

然后打开navicat连接数据库,在我们的search_table表里随便加两条数据:

在这里插入图片描述

然后运行我们的app.py,在浏览器内输入127.0.0.1:5000/search

在这里插入图片描述

在搜索框里输入Flask,点击检索:

在这里插入图片描述

就跳到了检索详情页面:

在这里插入图片描述

点击确定会跳回到检索页面。到这里这个简单的项目就算是大功告成啦。

写在后面

这个搜索引擎只是一个最简单的框架,没有做模糊搜索之类的东西进去,后续可能会更新一下,想要进一步开发的同学,前端自己去找一些花里胡哨的模板套一下。可能写的没那么详细,开发过程中也会因为sqlalchemy或者mysql的一些问题报错,不过不用担心,编程不就是不断出现问题,不断解决问题的一个过程嘛,重要的不是代码,重要的是学习和解决问题的能力。

创作不易,各位看官点下关注不过分吧,有问题可以到我的主页留言喔,关于Flask的一些小项目我会持续更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Flask+mysql开发一套自己的搜索引擎(附源码) 的相关文章

  • php echo 不工作

    我的代码似乎不起作用 单选按钮出现 但旁边什么也没有 似乎 mysql fetch array 由于某种原因无法工作 因为我已经玩过代码并反复测试它以查找代码似乎遇到的位置出现问题并停止工作 有人可以告诉我出了什么问题吗 欢呼声我是新手 最
  • mysql计算唯一行值

    TABLE quotation id clientid 1 25 2 25 3 25 4 25 5 26 如何查询有多少个不同的客户端TABLE quotation 我不希望重复的条目被计算多次 我需要的答案是2 在 1 行中 因为唯一的非
  • Java MYSQL/JDBC 查询从缓存的连接返回过时的数据

    我一直在 Stackoverflow 中寻找答案 但似乎找不到不涉及 Hibernate 或其他数据库包装器的答案 我直接通过 Tomcat 6 Java EE 应用程序中的 MYSQL 5 18 JDBC 驱动程序使用 JDBC 我正在缓
  • 优化mysql中日期类型字段的查询

    我目前准备了以下查询 select sum amount as total from incomes where YEAR date 2019 and MONTH date 07 and incomes deleted at is null
  • 如何在 PHP MYSQL 中将数据库表和每条记录从一台数据库服务器复制到另一台数据库服务器?>

    您好 我编写了一段代码 可以将数据库表从一个服务器复制到另一个服务器 但是每个表的记录没有复制 如何编写一个可以将表和每个记录从一个数据库服务器复制到另一个数据库服务器的函数 这是我的示例代码
  • MySQL - 查询合并具有相同 id 的行并保留该 id 的所有条目但作为一条记录

    我一直在处理本地保存在 wamp 服务器上的 mysql 数据库中的表 我正在使用 wamp 中的 phpmyadmin 区域来运行查询 我正在尝试获取数据来执行以下操作 谁能帮我制作一张包含许多植物记录的表格 植物可以有多个名称 表格将其
  • AttributeError:尝试在 python 中运行 sqlalchemy 来管理我的 SQL 数据库时,“Engine”对象没有属性“execute”

    我有以下代码行不断给我一个错误 即引擎对象没有对象执行 我认为我一切都对 但不知道接下来会发生什么 似乎其他人也遇到了这个问题 重新启动他们的笔记本电脑就可以了 我正在使用 Pycharm 并已重新启动但没有任何解决方案 任何帮助是极大的赞
  • 为什么涉及用户变量的表达式的求值顺序未定义?

    From MySQL手册 http dev mysql com doc refman 5 7 en user variables html以下查询的输出不保证始终相同 SET a 0 SELECT a AS first a a 1 AS s
  • 更新\插入数据从grafana到mysql

    可以从grafana更新数据或插入数据到mysql 我需要使用 UI 在 mysql 中插入 更新信息 现在我已经在使用grafana 所以想知道是否有任何方法可以使用grafana来更新或插入信息 没有用于获取用户输入并将该数据插入 My
  • PHP MySQL 查询带有 %s 和 %d

    SELECT COUNT AS test FROM s WHERE id d AND tmp mail lt gt 什么是 s and d for 这些是使用的格式符号 例如经过sprintf 例子 Output SELECT COUNT
  • 如果一列没有值,MySQL 返回最大值或 null

    我尝试获取 mysql select 的最大值 但如果有一行不包含时间戳 则希望将其设置为 null empty 0 表统计数据 简化 ID CLIENT ORDER DATE CANCEL DATE 1 5 1213567200 2 5
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • angularjs无法找到模板目录,flask作为后端

    我使用 Flask 作为后端 在客户端使用 angularjs 我的目录结构 dew gt app py gt templates gt hello html gt test html gt static gt js gt directiv
  • MySQL 将 ÅäÖ 视为 AAO?

    这两个查询给了我完全相同的结果 select from topics where name Harligt select from topics where name H rligt 这怎么可能 看起来mysql在搜索时会将 翻译成aao
  • CakePHP - 获取上次运行的查询

    我想获取 CakePHP 运行的最后一个查询 我无法在 core php 中打开调试 也无法在本地运行代码 我需要一种方法来获取最后一个 sql 查询并将其记录到错误日志中而不影响实时站点 该查询失败但正在运行 像这样的事情会很棒 this
  • MySQL中如何存储小数?

    我尝试过将 DECIMAL 与 2 2 一起使用 但它不允许我使用它 我只想存储一个数字 例如 7 50 或 10 50 我需要将这两个数字保留在小数点后 但是当我刷新数据库时 它会将值重置为 0 99 有什么建议么 第一个参数DECIMA
  • Python 的 mysqldb 晦涩文档

    Python 模块 mysqldb 中有许多转义函数 我不理解它们的文档 而且我努力查找它们也没有发现任何结果 gt gt gt print mysql escape doc escape obj dict escape any speci
  • 使用数据库进行日志记录

    大多数日志似乎都是纯文本形式 而不是放入 MySQL 其他类型的数据库中 这是否有原因 在我看来 将它们放入数据库将使分析变得非常非常容易 但这会以牺牲速度还是其他什么为代价 我不太关心可移植性 显然你会有数据库连接的文本日志 我能想到两大
  • 通过Java从MySQL中获取大量记录

    有一个 MySQL 表 服务器上的用户 它有 28 行和 100 万条记录 也可能会增加 我想从这个表中获取所有行 对它们进行一些操作 然后将它们添加到 MongoDB 中 我知道通过简单的 从用户中选择 操作来检索这些记录将花费大量时间
  • 使用 SERVER_NAME 时出现 Flask 404

    在我的 Flask 配置中 我将 SERVER NAME 设置为 app example com 之类的域 我这样做是因为我需要使用url for with external网址 如果未设置 SERVER NAME Flask 会认为服务器

随机推荐

  • 软件工程实验:银行储蓄系统

  • Eclipse 导入Maven项目,提示Project .. already exists Add a version or custom suffix using “Name template“

    今天从svn 上检出项目至本地的Eclipse workspace 工作空间 提示如下截图错误 Project already exists Add a version or custom suffix using Name templat
  • 解决方案不显示分类的

    解决方案无法显示头文件 源文件等分类 现象 正常显示 错误显示 原因 对应解决方案的filters文件里有不匹配的标签
  • 题目描述001

    题目描述001 入职后 导师会请你吃饭 你选择了火锅 火锅里会在不同时间下很多菜 不同食材要煮不同的时间 才能变得刚好合适 你希望吃到最多的刚好合适的菜 但你的手速不够快 用m代表手速 每次下手捞菜后至少要过m庙才能在捞 每次只能捞一个 那
  • 基于TensorFlow2实现的宠物识别系统(爬虫、模型训练和调优、模型部署)

    目录 开发环境 0 项目准备 1 数据集准备 2 数据预处理 3 构建模型 4 模型训练及验证 5 模型部署 6 项目地址 开发环境 作者 嘟粥yyds 时间 2023年8月25日 集成开发工具 PyCharm Professional 2
  • 关于vue.config.js中配置前端代理

    写在前边 注意开发环境的本地代理或者测试环境的代理 在部署到正式上时 一定要换成线上的IP地址 不然 数据拿不到哦 代理配置 esay mock新地址 模拟接口地址 就以第一个进行说明怎么配置和使用了 只说代理配置部分 其它不再说明 新建项
  • Response响应方法详解

    Response 响应 服务器把请求的处理结果告知客户端 在B S架构中 响应就是把结果带回浏览器 响应对象 在项目中用于发送响应的对象 常用状态码 状态码 说明 200 执行成功 302 它和307一样 都是用于重定向的状态码 只是307
  • M3U8文件简介及在线播放器

    m3u8文件格式 M3U8是Unicode版本的M3U 用UTF 8编码 M3U 和 M3U8 文件都是苹果公司使用的 HTTP Live Streaming HLS 协议格式的基础 这种协议格式可以在 iPhone 和 Macbook 等
  • QSpinBox修改样式 去掉上下键

    1 找到QSpinBox控件 右键 改变样式表 将以下代码粘贴进去 QSpinBox border 1px solid 242424 QSpinBox up button QSpinBox down button width 0px 修改前
  • Dev-C++之开启装逼效果

    Dev C 是个不错的C IDE 在10年前 它是很不错 在现在 它是个以界面丑陋和调试像吃粑粑这两点著称 如下图 实在是丑到离谱 丑到无法忍受 可是没办法呀 人家CCF规定比赛用这个 你个小蒟蒻吵什么 我现在就来讲讲怎么把你的Dev C
  • 【Android -- 面试】Android 知识点(四大组件)

    目录 文章目录 目录 Activity Fragment Service Broadcast Receiver ContentProvider Activity 1 说下 Activity 的生命周期 参考回答 在 Activity 的生命
  • Syntax Error: Error: PostCSS received undefined instead of CSS string

    Syntax Error Error PostCSS received undefined instead of CSS string Module Error from node modules sass loader dist cjs
  • 异步Buck和同步Buck的特点

    1 介绍 随着时代的发展 工业 车载 通信 消费类等产品都提出了小型化 智能化的需求 相应的 对于这些系统中的电源模块提出了小型化的要求 目前 市场上依然存在很多异步Buck电源管理芯片使用的场景 针对这些应用 采用同步Buck电源管理芯片
  • 今日热榜前 5 的 GitHub 项目

    今日开源热榜 Top5 项目目录 1 纪念左耳朵耗子 2 你的第二大脑 3 大模型开发人员需要记住的数 4 短链接管理工具 5 StableStudio 01 纪念左耳朵耗子 MegaEase 创始人兼 CEO 陈皓 网名 左耳朵耗子 于上
  • VSCode搭建ARM(STM32开发环境)

    目录 需要用到的工具 软件安装 下载安装 Visual Studio Code 下载安装 STM32Cubemx 下载安装 ARM GCC交叉编译工具链 下载安装 Msys2 下载安装 OpenOCD 下载安装 Make 开发环境配置 ms
  • 虚拟机扩容,解决虚拟机磁盘根目录不足

    当你打开虚拟机时会提示 你的磁盘根目录不足 这表明你需要对自己的虚拟机进行扩容 详细步骤如下 第一步 你需要将自己的虚拟机关机 即关闭电源 第二步 右键你需要扩容的虚拟机 然后点击设置 第三步 点击硬盘 第四步 点击右边进行扩容 将磁盘容量
  • 小米手机无法调试应用解决Installation failed with message Failed to establish session.

    小米手机性价比高 有些问题也很尖锐 比如我的5S用了黑科技 试验品 超声波指纹解锁 识别率就很低 每次解锁都要哈口气 真后悔 而且最近又遇到新问题 我的小米5S无法通过android studio调试应用 卖批啊 但即使这样也比蓝绿工程的O
  • Java集合之单列集合

    分类 集合分为单列集合 Collection 和双列集合 Map 单列集合的体系结构 List集合和Set集合的区别 List系列集合 添加元素是有序的 添加的顺序 而非数据的大小顺序 可重复 有索引 Set系列集合 添加的元素是无序的 添
  • erlang escript使用

    Erlang scripting support 让erlang可以向unix script 一样做脚本使用 script name script arg1 script arg2 escript escript flags script
  • 使用Flask+mysql开发一套自己的搜索引擎(附源码)

    使用Flask mysql开发一套自己的搜索引擎 附源码 前言 主要是针对在内网办公的朋友 可以把这一套部署到单机或者公司服务器 做一些名词查询 语言翻译的功能 如果需要的话可以扩展一下 搞成一套类似于内网网盘的软件 这个我们下期再讲 这期