57个挑战之57(part5):客户端+web前端+服务端调度逻辑

上题目

接前面:

https://www.toutiao.com/article/7131944951776150056/

https://www.toutiao.com/article/7129048315920335399/

https://www.toutiao.com/article/7128604966595920414/

https://www.toutiao.com/article/7128196832081183236/


这两天先写了下前后端的逻辑+相关的实现函数,在缓存题库这个事情上产生了疑问。

1.实现方法1:(所有问题+答案一次发送到web端,js逻辑判断)

一次性把所有题目+答案都发给客户端,让客户端JS 做判断,如果正确,则取下一个数,如果答题错误则统计并终止循环。

(这个方法有个漏洞,操作的时候,所有题库的信息都发给客户端了,容易作弊)

2.实现方法2:(一次性发一个题目及答案到web端,js逻辑判断这个题目答案是否正确,如果正确,则向python客户端申请读取下一个问题。)

方法2的好处是,每次给web 客户端,只提供一道题,如果答对了才能往下走。

实现方法2需要做一个会话的识别,也就是说,识别web端的身份,不同的客户拿到的题库是不一样的,而同样的客户题库是一样的。

如果要实现上面的要求,一个方法是采用token,识别客户身份,如果身份匹配则继续答题。

另外,根据身份来缓存题库,python 客户端从服务端获取到题库后,根据每个客户token做一个缓存.

具体的调度逻辑如下:


图1:业务调度逻辑

这里包括了客户端和服务端互相调度的逻辑。

客户端逻辑:

import requestsimport randomfrom flask import Flask,request,render_template,url_for,redirectapp = Flask(__name__)def get_data():    """    函数作用:从服务端读入题库,以JSON格式返回    输入:无    返回:从服务端题库随机读取10个题目,并返回    """    print("start process get_data")    url = "http://127.0.0.1:8008/get"    ret = requests.post(url)    dic1 = ret.json()    print("end process get_data")    return dic1def orderlize(questionlist):    """    函数作用:读入列表,并把列表做处理,按照列表中每个字典的‘R’(难度) 大小排序。    输入:问题list列表    返回:根据'R‘排序后的问题列表    """    print("start process orderlize")    print("列表通过难度值进行排序")    sortedlist = sorted(questionlist,key = lambda i : i['R'])    print(sortedlist)    print("end process orderlize")    return sortedlistdef randomlize_input(dic1):    """    函数作用:输入问题,对这个问题里面的答案和干扰项目做随机化,并返回给展示界面,包含问题、正确答案、随机化的答案+干扰项目    输入:问题list 列表中的每一个对象(字典对象)    输出:返回这个字典    """    list1 = [dic1['A'], dic1['D1'], dic1['D2'], dic1['D3']]    listrandom = random.sample(list1,4)    return dic1['Q'],dic1['A'],listrandom@app.route('/',methods=['GET','POST'])def start_html():    """    1.get请求打开首页,选择开始答题。      介绍规则,选择10道题,然后从容易往复杂进行答复,如果答题错误则结束。    2.post请求 展示开始答题      跳转到函数答题    """    #逻辑1:点击开始答题,读取题库信息    if request.method == "POST":       return redirect('/question')    if request.method == "GET":       #1.展示首页,展示"开始答题"       #1.1 点击开始答题发送请求到后端开始答题       return render_template('index57.html')@app.route('/question',methods=['GET','POST'])def start_question():    if request.method == "POST":       totalcorrectquestion = request.json["count"]       print("total answered correct question is {0}".format(totalcorrectquestion))       #2.1 接收用户选择,       #2.2判断第一道题答案是否正确       #2.3 如果正确,累计答题正确数+1,且调度下一道题       #2.5 如果失败,统计答题正确数right,传递到展示展示界面       return render_template('statistics.html',totalcorrectquestion=totalcorrectquestion)    if request.method == "GET":       # 2.1 接收传入的字典信息,       try:           print(sortedlist)       except NameError:           print("sortedlist is not exist")           print("initialize")           dic1 = get_data()           print(dic1)           questionlist = dic1['data']           sortedlist = orderlize(questionlist)           print(sortedlist)       #2.2 展示第一道题       try:           print(i)           i = i+1       except NameError:           i = 0       Q,A,listrandom = randomlize_input(sortedlist[i])       return render_template('start_question4.html',Q=Q,A=A,listrandom=listrandom)@app.route('/statistics')def take_account(right):    # 展示正确答案     return 1if __name__ =='__main__':    app.run(host='0.0.0.0',port=80,debug = True)


服务端逻辑:

import copyimport flask,pymongofrom flask import Flask,jsonify,requestapp = Flask(__name__)def insert_mongo(list1):    myclient = pymongo.MongoClient('mongodb://127.0.0.1:27017/')    mydb= myclient.client["lukedb5"]    mycol = mydb["site"]    x = mycol.insert_many(list1)    print(x.inserted_ids)    return "success"def get_mongo():    myclient = pymongo.MongoClient('mongodb://127.0.0.1:27017/')    mydb= myclient.client["lukedb5"]    mycol = mydb["site"]    list2 =[]    for x in mycol.aggregate([{'$sample':{'size':10}}]):        del x['_id'] #把id项目删除        list2.append(x)    print(list2)    return list2,"success"def getall_mongo():    myclient = pymongo.MongoClient('mongodb://127.0.0.1:27017/')    mydb= myclient.client["lukedb5"]    mycol = mydb["site"]    list3 =[]    for x in mycol.find({},{"_id":0}):#把id项目删除        list3.append(x)    print(list3)    return list3,"success"def update_mongo(listold,listnew):    myclient = pymongo.MongoClient('mongodb://127.0.0.1:27017/')    mydb= myclient.client["lukedb5"]    mycol = mydb["site"]    for x in range(0,len(listold)):#把id项目删除        myquery = listold[x]        newvalues = {"$set":listnew[x]}        mycol.update_one(myquery,newvalues)    return "success"@app.route('/')def hello_world():    return 'Hello World!'@app.route('/get',methods=['POST'])def get():#调用查询逻辑    #获取题目10个    #获取难度3个容易,5个中等,2个难题    list2,info = get_mongo()    return jsonify({"info":info,"data":list2})@app.route('/append',methods=['GET','POST'])def append():#调用插入逻辑    list1 = request.json["list"]    #dic1 = {"Q":"How old is Republic of China1","A":"73","D1":"72","D2":"74","D3":"111"}    #list1 =[dic1]    list2 = copy.deepcopy(list1)    info = insert_mongo(list1)    #print(info)    #print(dic1)    #print(list2)    return jsonify({"info":info,"data":list2})@app.route('/getall', methods=['POST'])def getall():# 调用抽取接口,把题库数据读出来    list3,info = getall_mongo()    return jsonify({"whole question lib is":list3,"info":info})@app.route('/update', methods=['POST'])def update():# 调用update 接口,修改题目    listold = request.json["listold"]    listnew = request.json["listnew"]    info = update_mongo(listold,listnew)    return jsonify({"info": info,"oldinfo":listold,"newinfo":listnew})if __name__ =='__main__':    app.run(host='0.0.0.0',port=8008,debug = True)


web端逻辑:

        start_question3.html    问题是: 





当前这段代码有个问题,就是没有缓存会话的逻辑,后续需要优化:
问题1:



后续准备根据图1,准备一个python客户端本地缓存到redis的逻辑,另外做一个python 客户端判断token的逻辑,及js端制作token的逻辑。

逻辑图图片不够清晰,放大了重新贴一下



发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章