• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
乐途同学
帮助1

使用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的一些小项目我会持续更新。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgahbfb
系列文章
更多 icon
同类精品
更多 icon
继续加载