From 88575f02629a8696160039a76838b6464de9496a Mon Sep 17 00:00:00 2001 From: Tdxdxoz Date: Sat, 26 Dec 2020 19:43:00 +0800 Subject: [PATCH] feat: download redirect, login redirect --- app.py | 42 ++++++++++++++++++++++++++++++++---------- templates/list.html | 11 ++++------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/app.py b/app.py index 039ef82..df6cbab 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,4 @@ -from flask import Flask, request, render_template, send_from_directory, abort, redirect, session +from flask import Flask, request, render_template, send_from_directory, abort, redirect, session, url_for from flask_sqlalchemy import SQLAlchemy from flask_limiter import Limiter from flask_limiter.util import get_remote_address @@ -6,7 +6,8 @@ from flask_limiter.util import get_remote_address import ipfshttpclient from datetime import date, datetime -from werkzeug.utils import secure_filename +from functools import wraps +import hashlib import os from config import C @@ -27,21 +28,35 @@ ipfs_client = ipfshttpclient.connect() class Paper(db.Model): id = db.Column(db.Integer, primary_key=True) course = db.Column(db.String(30), index=True) - teacher = db.Column(db.String(10), index=True) + teacher = db.Column(db.String(30), index=True) year = db.Column(db.Integer, index=True) author = db.Column(db.String(30), index=True) notes = db.Column(db.String(200)) anon = db.Column(db.Boolean) create_date = db.Column(db.Date) like_num = db.Column(db.Integer, index=True, default=0) + down_num = db.Column(db.Integer, index=True, default=0) file_hash = db.Column(db.String(64)) -db.create_all() +if __name__ == "__main__": + db.create_all() -# TODO 登陆 +def login_required(f): + @wraps(f) + def df(*args, **kwargs): + username = session.get('username') + if not username or (not C.allow_guest_upload and username.startswith('guest(')): + return redirect(url_for('login')) + return f(*args, **kwargs, username=username) + return df + +@app.route('/pastExam/login') +def login(): + return app.send_static_file('login.html') @app.route('/pastExam/') -def list(): +@login_required +def list(username): course = request.args.get('course') teacher = request.args.get('teacher') year = request.args.get('year') @@ -67,7 +82,7 @@ def list(): all_courses = [i for i, in db.session.query(Paper.course.distinct()).all()] all_teachers = [i for i, in db.session.query(Paper.teacher.distinct()).all()] all_years = [i for i, in db.session.query(Paper.year.distinct()).all()] - ipfs_base_url = C.ipfs_base_url + ipfs_version = hashlib.sha256(C.ipfs_base_url.encode('utf-8')).hexdigest() return render_template('list.html', **locals()) def check_length(x, limit=30, allow_null=False): @@ -75,8 +90,8 @@ def check_length(x, limit=30, allow_null=False): @app.route('/pastExam/upload', methods=['POST']) @limiter.limit("10 / hour") -def upload(): - username = 'guest' # TODO +@login_required +def upload(username): name = request.form.get('name') teacher = request.form.get('teacher') year = request.form.get('year') @@ -84,7 +99,7 @@ def upload(): notes = request.form.get('notes', '') anon = request.form.get('anon') == 'on' - if not (check_length(name) and check_length(teacher, 10) and check_length(notes, 200, True)): + if not (check_length(name) and check_length(teacher) and check_length(notes, 200, True)): abort(422) files = request.files.getlist('files[]') @@ -120,3 +135,10 @@ def upload(): return redirect('.#part2') +@app.route('/pastExam//download') +@login_required +def download(pid, username): + p = Paper.query.get_or_404(pid) + # TODO: download number + return redirect(C.ipfs_base_url + p.file_hash, code=301) # 301减少不必要的请求 + diff --git a/templates/list.html b/templates/list.html index 04098d1..11990a7 100644 --- a/templates/list.html +++ b/templates/list.html @@ -4,7 +4,7 @@ - + @@ -19,9 +19,6 @@ #fff calc(50% + 1px) ); background-size: 6px 5px; - } - - body { font-family: 'Noto Sans SC', sans-serif; } @@ -196,7 +193,7 @@
- +