diff --git a/app.py b/app.py index e860008..6cd6621 100644 --- a/app.py +++ b/app.py @@ -1,9 +1,10 @@ -from flask import Flask, request, render_template, send_from_directory, abort, redirect +from flask import Flask, request, render_template, send_from_directory, abort, redirect, session from flask_sqlalchemy import SQLAlchemy from flask_limiter import Limiter from flask_limiter.util import get_remote_address from mastodon import Mastodon import re +import random from datetime import datetime from dateutil.tz import tzlocal import html2text @@ -11,6 +12,7 @@ from config import C app = Flask(__name__) app.config.from_object('config.C') +app.secret_key = C.session_key th = Mastodon( access_token = C.token, @@ -35,11 +37,12 @@ class Candidate(db.Model): url = db.Column(db.String(50)) time = db.Column(db.DateTime) toot = db.Column(db.BigInteger) + likeNum = db.Column(db.Integer, default=0) class Like(db.Model): id = db.Column(db.Integer, primary_key=True) cid = db.Column(db.Integer) - ip = db.Column(db.String(45)) + uid = db.Column(db.Integer) db.create_all() @@ -47,16 +50,28 @@ db.create_all() def send_img(path): return send_from_directory('static/img', path) +@app.route('/ordinary/set_session') +@limiter.limit("3 / hour; 1 / 5 minute") +def set_session(): + if 'uid' not in session: + session['uid'] = random.randint(0, 2000000000) + return redirect('.') + @app.route('/ordinary/') def can_list(): key = request.args.get('key') - rip = request.remote_addr + sort_by = request.args.get('sort_by', 'time') + + if 'uid' not in session: + return redirect('set_session') + uid = session['uid'] - pag = Candidate.query.order_by(db.desc('id')).paginate(max_per_page=100) + q = Candidate.query + q = q.order_by(db.desc('likeNum')) if sort_by=='likeNum' else q.order_by(db.desc('id')) + pag = q.paginate(max_per_page=100) def check_like(c): - c.likeNum = Like.query.filter_by(cid=c.id).count() - c.liked = 'liked' if Like.query.filter_by(ip=rip, cid=c.id).count() else 'like' + c.liked = 'liked' if Like.query.filter_by(uid=uid, cid=c.id).count() else 'like' return c pag.items = map(check_like, pag.items) @@ -66,12 +81,12 @@ def can_list(): 'ques': ques, 'hint': hint } for name, ques, hint, ans in C.verify - ] + ] - return render_template('list.html', pagination=pag, vs=vs, showPrivate=(key==C.key)) + return render_template('list.html', pagination=pag, vs=vs, showPrivate=(key==C.key), sort_by=sort_by, key=key) @app.route('/ordinary/new', methods=['POST']) -@limiter.limit("3 / hour; 1 / 2 second") +@limiter.limit("5 / hour; 1 / 2 second") def new_one(): content = request.form.get('text') @@ -139,15 +154,17 @@ def like(toot): if not c: abort(404) - rip = request.remote_addr - if Like.query.filter_by(ip=rip, cid=c.id).first(): + uid = session['uid'] + if not uid: abort(401) + if Like.query.filter_by(uid=uid, cid=c.id).first(): return '点赞过了', 403 - l = Like(ip=rip, cid=c.id) + l = Like(uid=uid, cid=c.id) + c.likeNum += 1 db.session.add(l) db.session.commit() - return str(Like.query.filter_by(cid=c.id).count()) + return str(c.likeNum) if __name__ == '__main__': diff --git a/static/img/ord/icon-128.png b/static/img/ord/icon-128.png new file mode 100644 index 0000000..ba8fb6e Binary files /dev/null and b/static/img/ord/icon-128.png differ diff --git a/templates/list.html b/templates/list.html index 981f77d..2a910cd 100644 --- a/templates/list.html +++ b/templates/list.html @@ -256,12 +256,13 @@ {% endfor %} +

按时间 | 按赞数