from datetime import datetime from admin_service import ADMIN_NAME from flask import * # from app import Yaml # from app.Article import get_today_article, load_freq_history # from app.WordFreq import WordFreq # from app.wordfreqCMD import sort_in_descending_order 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 import logging logging.basicConfig(filename='log.txt', format='%(asctime)s %(message)s', level=logging.DEBUG) # 初始化蓝图 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_%s.pickle' % (username) 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 logging.debug('/get_next_article: start calling get_today_arcile()') visited_articles, today_article, result_of_generate_article = get_today_article(user_freq_record, session.get('visited_articles')) logging.debug('/get_next_arcile: done.') 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/' + 'frequency_%s.pickle' % (username) 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/' + 'frequency_%s.pickle' % (username) 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/' + 'frequency_%s.pickle' % (username) 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/' + 'frequency_%s.pickle' % (username) if request.method == 'POST': # when we submit a form content = request.form['content'] f = WordFreq(content) lst = f.get_freq() return render_template('userpage_post.html',username=username,lst = lst, yml=Yaml.yml) elif 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/' + 'frequency_%s.pickle' % (username) if request.method == 'POST': # 提交标记的单词 d = load_freq_history(user_freq_record) lst_history = pickle_idea2.dict2lst(d) lst = [] # pickle_idea2.save_frequency_to_pickle中设置的较为简单的无法加入生词簿的单词,虽然生词簿未添加但添加后顶部依然会显示"Added ***"的信息 exclusion_lst = ['one', 'no', 'has', 'had', 'do', 'that', 'have', 'by', 'not', 'but', 'we', 'this', 'my', 'him', 'so', 'or', 'as', 'are', 'it', 'from', 'with', 'be', 'can', 'for', 'an', 'if', 'who', 'whom', 'whose', 'which', 'the', 'to', 'a', 'of', 'and', 'you', 'i', 'he', 'she', 'they', 'me', 'was', 'were', 'is', 'in', 'at', 'on', 'their', 'his', 'her', 's', 'said', 'all', 'did', 'been', 'w'] add = request.form.getlist('marked') trueadd = [] for word in add: if word not in exclusion_lst: trueadd.append(word) lst.append((word, [get_time()])) if len(trueadd) > 0: # 如果有单词被添加 d = pickle_idea2.merge_frequency(lst, lst_history) if len(lst_history) > 999: flash('You have way too many words in your difficult-words book. Delete some first.') else: pickle_idea2.save_frequency_to_pickle(d, user_freq_record) flash('Added %s.' % (', '.join(trueadd))) # 显示添加的单词 else: flash('No new words were added. All words were either too simple or already in your list.') # 没有单词被添加 return redirect(url_for('user_bp.userpage', username=username)) else: return 'Under construction' def get_time(): ''' 获取当前时间 :return: 当前时间 ''' return datetime.now().strftime('%Y%m%d%H%M') # upper to minutes