利用flask实现算法嵌入。
协同过滤推荐不同于随机推荐,随机推荐逻辑只需要写js就够了,但是协同过滤必须要调用python算法。
在HTML中直接调用本地Python程序是十分不推荐的,一是因为网页调用本地程序的权限正在被取消,二是因为真不如JS写直接,三是只能在自己本地调用。
项目统一使用了flask,所以通过flask实现python算法的嵌入。
app.py文件
from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
import csv
import os
from rec import recommend_food
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
#建立数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SECRET_KEY'] = '1234567'
db = SQLAlchemy(app)
class Food(db.Model):
__tablename__ = 'food'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), nullable=True)
img = db.Column(db.String(64), nullable=True)
material = db.Column(db.String(255), nullable=True)
db.create_all()
@app.route('/')
def hello_world():
return redirect('/food/')
@app.route('/food/')
def food():
page = int(request.args.get('page', 1))
per_page = int(request.args.get('per_page', 6))
#用户模块接口,从用户模块获取用户id,调用rec.py里recommend_food()函数,返回推荐食品的id
#recommend_food()函数为空时,为默认参数,即def recommend_food(latent_len=64, user_num=33278, item_num=172946, user=20, k=30)
#此函数用户模块需要传的值仅有user(第四个参数),即用户id
food_id_list = recommend_food()
id_type=[type(i)for i in food_id_list]
paginate = Food.query.filter(Food.id.in_(food_id_list)).paginate(page, per_page, error_out=False)#从数据库用食品id查询name、img名称、materials,并传递给前端
# paginate = Food.query.order_by(Food.id).paginate(page, per_page, error_out=False)
items = paginate.items
print(items)
return render_template('index.html', items=items, paginate=paginate, page=page)
#读csv建立数据库,读一次即可
# with open('static/食谱.csv', 'r', encoding='utf-8') as f:
# reader = csv.reader(f)
# for row in reader:
# food = Food(id=int(row[0]), name=row[1], material=row[2], img=str(row[0]) + '.jpg')
# db.session.add(food)
# db.session.commit()
if __name__ == '__main__':
app.run()