本次实验将基于 Flask 框架与 MySQL 数据库,使用 Python 语言实现一个简单的番剧推荐系统。
本实验中我们将学习并实践以下知识点:
本课程将最终将实现下面的效果,输入 User Number
,这里使用数字代替,页面输出为番剧名称和描述,使用字母代替:
Flask 是一个 Python 语言的微型网络开发框架。微框架中的 “微” 意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎则很容易替换。
Flask 基于 WerkzeugWSGI 工具箱和 Jinja2 模板引擎。实验中你将会知道 Jinja2 给予我们极大的方便,比如可以传递变量参数等。让我们的表示层动态的展示你想展示的信息,更详细的说明可参考 Python Flask Web框架。
MySQL 作为一种关系型数据库,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。并且实验楼已经安装好 MySQL,故实验时只需使用即可。
我们要用到的 SQL 语句包括 select 语句,insert into 语句,create 语句,order by 子句, Limit限制语法,natural join 语法。由于会涉及到较复杂查询,对于上述 SQL 用法不太熟悉或不会的同学,建议去学习一下实验楼的 SQL 课程。
本课程中我们将代码设计为 app.py与recommend.py 两个模块:
由业务逻辑出发,可发现实体类 user(用户) 和 anime(番剧),弱实体类 style,联系集 user_anime(记录用户喜欢的番剧),anime_style(番剧的标签)。
为防止库的冲突我们先安装虚拟环境,打开桌面上的 Xfce 终端,输入下面的命令:
sudo apt-get install python-virtualenv
安装过程如下:
创建myproject文件夹并激活virtualenv:
mkdir myproject
cd myproject
virtualenv venv
在 virtualenv 中安装 Flask:
pip install -i http://mirrors.aliyuncs.com/pypi/simple flask
编写最简单的 Python 代码来测试 Flask:
from flask import Flask
app=Flask(__name__)
@app.route('/')
def index():
return "hello"
if __name__=="__main__":
app.run(debug=True)
运行编写的代码:
使用浏览器访问 localhost:5000
查看 Flask Web 服务是否已经启动:
至此 Flask 安装成功。
首先,需要启动 MySQL 服务,进入 Xfce 终端后启动并进入 MySQL 命令行(密码为空):
成功进入,MySQL 已启动,但是我们还需将它与 Python 连接起来。
安装 python-mysqldb 包:
进入 MySQL 创建一个数据库 recommend
:
编写测试连接数据库代码:
import MySQLdb
db=MySQLdb.connect("localhost","root","","recommend")
cursor=db.cursor()
sql="create table user_anime(user int,anime int)"
cursor.execute(sql)
db.close()
简单说明一下上面的代码:
回数据库查看一下
use recommend;
show tables;
可以发现数据库表创建成功,连接成功。
说明:由于实验楼的网络限制需要自行插入数据,在实际情况下数据为用代码导入,并且数据量要多得多。下面的数据仅仅为完成简单推荐系统而设定的数据,所以没有什么实际意义。但是通过这个实验过程,同学们可以学会如何使用这个方法。
在 MySQL 提示符后输入相关命令,首先需要删除上述步骤的测试表,开始正式创建数据库。
依次完成下列的创建过程:
创建过程如下图所示:
create table user(
id int,
name varchar(20),
primary key(id)
);
create table anime(
id int,
name varchar(20),
brief varchar(100),
primary key(id)
);
插入数据:
数据操作如下图:
insert into user values(1,"Tom");
select * from user;
insert into anime values(279,"a","A");
select * from anime;
insert into anime values(3494,"b","B");
insert into anime values(3377,"c","C");
insert into anime values(3452,"d","D");
insert into anime values(782,"e","E");
insert into anime values(3421,"f","F");
insert into anime values(2730,"g","G");
下面创建联系集,首先创建番剧和对应类型的表。这里需要用到外键。对于 foreign key 解释一下,这个定义的是外键,其约束是 anime_id 的值域在 anime 表的 id 值域之中,其对于保持数据库的一致性很重要。
create table anime_style(
anime_id int,
style_id int,
foreign key(anime_id) references anime(id)
);
插入关联数据,这里比较多,希望大家不要反感。
insert into anime_style values(279,26);
insert into anime_style values(279,30);
insert into anime_style values(279,32);
insert into anime_style values(279,8);
insert into anime_style values(279,7);
insert into anime_style values(3494,9);
insert into anime_style values(3494,19);
insert into anime_style values(3494,29);
insert into anime_style values(3494,46);
insert into anime_style values(3377,34);
insert into anime_style values(3377,7);
insert into anime_style values(3377,18);
insert into anime_style values(3452,30);
insert into anime_style values(3452,32);
insert into anime_style values(3452,7);
insert into anime_style values(3452,22);
insert into anime_style values(782,30);
insert into anime_style values(782,32);
insert into anime_style values(782,7);
insert into anime_style values(782,1);
insert into anime_style values(782,50);
insert into anime_style values(3421,30);
insert into anime_style values(3421,32);
insert into anime_style values(3421,7);
insert into anime_style values(3421,22);
insert into anime_style values(2730,11);
insert into anime_style values(2730,30);
insert into anime_style values(2730,22);
插入完成后,下面创建另一个联系集,user_anime 表:
create table user_anime(
user_id int,
anime_id int,
foreign key(user_id) references user(id),
foreign key(anime_id) references anime(id)
);
insert into user_anime values(1,782);
insert into user_anime values(1,3421);
insert into user_anime values(1,2730);
完成后,我们本实验测试所需要的数据库建立完毕。
本节说明了实验所需知识内容,并做实验完成了环境的部署,以及对环境进行了简单的测试。并且在 MySQL 中建立了表,插入了相关的测试数据。虽然过程有些艰难,但相信大家都能克服,在接下的试验中我们将会编写相关的 Python 代码,完成大家期待的推荐算法,和进行复杂的查询操作,最后完成推荐系统的搭建。