Browse Source

feat: download redirect, login redirect

master
欧醚 3 years ago
parent
commit
88575f0262
2 changed files with 36 additions and 17 deletions
  1. +32
    -10
      app.py
  2. +4
    -7
      templates/list.html

+ 32
- 10
app.py View File

@ -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/<pid>/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减少不必要的请求

+ 4
- 7
templates/list.html View File

@ -4,7 +4,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" type="image/png" href="/img/ord/icon-128.png" />
<link rel="icon" type="image/png" href="favioc.png" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<link href="https://fonts.yecdn.com/css2?family=Noto+Serif+SC:wght@300;700&display=swap" rel="stylesheet">
<link href="https://fonts.yecdn.com/css2?family=Noto+Sans+SC&display=swap" rel="stylesheet">
@ -19,9 +19,6 @@
#fff calc(50% + 1px)
);
background-size: 6px 5px;
}
body {
font-family: 'Noto Sans SC', sans-serif;
}
@ -196,7 +193,7 @@
<div class="form-group row">
<label class="col-sm-3 col-form-label">任课教师</label>
<div class="col-sm-9">
<input type="text" class="form-control" name="teacher" required placeholder="教师名" maxlength="10">
<input type="text" class="form-control" name="teacher" required placeholder="教师名" maxlength="30">
</div>
</div>
<div class="form-group row">
@ -311,8 +308,8 @@
<a href="##" class="btn btn-link" id="like-{{p.id}}" onClick="like('{{p.id}}')">
<span>有用({{p.like_num}})</span>
</a>
<a href="{{p.id}}/download" target="_blank" class="btn btn-link pl-0" id="like-{{p.id}}" onClick="like('{{p.id}}')">
<span>下载({{p.like_num}})</span>
<a href="{{p.id}}/download?v={{ipfs_version}}" target="_blank" class="btn btn-link pl-0" id="like-{{p.id}}" onClick="like('{{p.id}}')">
<span>下载({{p.down_num}})</span>
</a>
</div>
</div>

Loading…
Cancel
Save