from datetime import datetime from flask import render_template, session, url_for, redirect, request, json, escape, Blueprint from admin_service import ADMIN_NAME import Yaml from Article import get_today_article, load_freq_history from WordFreq import WordFreq from wordfreqCMD import sort_in_descending_order import pickle_idea import pickle_idea2 # 初始化蓝图 userService = Blueprint("user_bp", __name__) path_prefix = '/var/www/wordfreq/wordfreq/' path_prefix = './' # comment this line in deployment @userService.route("/get_next_article/",methods=['GET','POST']) def get_next_article(username): ''' 得到下一篇文章 ''' user_freq_record = path_prefix + 'static/frequency/' + 'frequency_{username}.pickle' session['old_articleID'] = session.get('articleID') if request.method == 'GET': visited_articles = session.get("visited_articles") if visited_articles['article_ids'][-1] == "null": # 如果当前还是“null”,则将“null”pop出来,无需index+=1 visited_articles['article_ids'].pop() else: # 当前不为“null”,直接 index+=1 visited_articles["index"] += 1 session["visited_articles"] = visited_articles visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles')) data = { 'visited_articles': visited_articles, 'today_article': today_article, 'result_of_generate_article': result_of_generate_article } else: return 'Under construction' return json.dumps(data) @userService.route("/get_pre_article/",methods=['GET']) def get_pre_article(username): ''' 得到上一篇文章 ''' user_freq_record = path_prefix + 'static/frequency/' + f'frequency_{username}.pickle' if request.method == 'GET': visited_articles = session.get("visited_articles") if(visited_articles["index"]==0): data='' else: visited_articles["index"] -= 1 # 上一篇,index-=1 if visited_articles['article_ids'][-1] == "null": # 如果当前还是“null”,则将“null”pop出来 visited_articles['article_ids'].pop() session["visited_articles"] = visited_articles visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles')) data = { 'visited_articles': visited_articles, 'today_article': today_article, 'result_of_generate_article':result_of_generate_article } return json.dumps(data) @userService.route("///unfamiliar", methods=['GET', 'POST']) def unfamiliar(username, word): ''' :param username: :param word: :return: ''' user_freq_record = path_prefix + 'static/frequency/' + 'frequency_%s.pickle' % (username) pickle_idea.unfamiliar(user_freq_record, word) session['thisWord'] = word # 1. put a word into session session['time'] = 1 return "success" @userService.route("///familiar", methods=['GET', 'POST']) def familiar(username, word): ''' :param username: :param word: :return: ''' user_freq_record = path_prefix + 'static/frequency/' + f'frequency_{username}.pickle' pickle_idea.familiar(user_freq_record, word) session['thisWord'] = word # 1. put a word into session session['time'] = 1 return "success" @userService.route("///del", methods=['GET', 'POST']) def deleteword(username, word): ''' 删除单词 :param username: 用户名 :param word: 单词 :return: 重定位到用户界面 ''' user_freq_record = path_prefix + 'static/frequency/' + f'frequency_{username}.pickle' pickle_idea2.deleteRecord(user_freq_record, word) # 模板userpage_get.html中删除单词是异步执行,而flash的信息后续是同步执行的,所以注释这段代码;同时如果这里使用flash但不提取信息,则会影响 signup.html的显示。bug复现:删除单词后,点击退出,点击注册,注册页面就会出现提示信息 # flash(f'{word} is no longer in your word list.') return "success" @userService.route("//userpage", methods=['GET', 'POST']) def userpage(username): ''' 用户界面 :param username: 用户名 :return: 返回用户界面 ''' # 未登录,跳转到未登录界面 if not session.get('logged_in'): return render_template('not_login.html') # 用户过期 user_expiry_date = session.get('expiry_date') if datetime.now().strftime('%Y%m%d') > user_expiry_date: return render_template('expiry.html', expiry_date=user_expiry_date) # 获取session里的用户名 username = session.get('username') user_freq_record = path_prefix + 'static/frequency/' + f'frequency_{username}.pickle' if request.method == 'POST': # when we submit a form content = escape(request.form['content']) f = WordFreq(content) lst = f.get_freq() return render_template('userpage_post.html',username=username,lst = lst, yml=Yaml.yml) if request.method == 'GET': # when we load a html page d = load_freq_history(user_freq_record) lst = pickle_idea2.dict2lst(d) lst2 = [] for t in lst: lst2.append((t[0], len(t[1]))) lst3 = sort_in_descending_order(lst2) words = '' for x in lst3: words += x[0] + ' ' visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles')) session['visited_articles'] = visited_articles # 通过 today_article,加载前端的显示页面 return render_template('userpage_get.html', admin_name=ADMIN_NAME, username=username, session=session, # flashed_messages=get_flashed_messages(), 仅有删除单词的时候使用到flash,而删除单词是异步执行,这里的信息提示是同步执行,所以就没有存在的必要了 today_article=today_article, result_of_generate_article=result_of_generate_article, d_len=len(d), lst3=lst3, yml=Yaml.yml, words=words) @userService.route("//mark", methods=['GET', 'POST']) def user_mark_word(username): ''' 标记单词 :param username: 用户名 :return: 重定位到用户界面 ''' username = session[username] user_freq_record = path_prefix + 'static/frequency/' + f'frequency_{username}.pickle' if request.method == 'POST': # 提交标记的单词 d = load_freq_history(user_freq_record) lst_history = pickle_idea2.dict2lst(d) lst = [] for word in request.form.getlist('marked'): lst.append((word, [get_time()])) d = pickle_idea2.merge_frequency(lst, lst_history) pickle_idea2.save_frequency_to_pickle(d, user_freq_record) return redirect(url_for('user_bp.userpage', username=username)) return 'Under construction' def get_time(): ''' 获取当前时间 :return: 当前时间 ''' return datetime.now().strftime('%Y%m%d%H%M') # upper to minutes