admin管理员组文章数量:1635374
使用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的一些小项目我会持续更新。
版权声明:本文标题:使用Flask+mysql开发一套自己的搜索引擎(附源码) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726552122a1075104.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论