Browse Source

feat: aliyun对象存储

SongZihuan 3 years ago
parent
commit
9d92b1e22f

+ 25 - 0
aliyun/__init__.py

@@ -0,0 +1,25 @@
+from configure import conf
+import oss2
+
+
+class Aliyun:
+    def __init__(self, key, secret, endpoint, name):
+        self.key = key
+        self.secret = secret
+        self.auth = oss2.Auth(key, secret)
+        self.bucket = oss2.Bucket(self.auth, endpoint, name)
+
+    def upload_file(self, name, f):
+        self.bucket.put_object(name, f)
+
+    def shared_obj(self, name, time=15):
+        return self.bucket.sign_url('GET', name, time, slash_safe=True)
+
+
+if conf["aliyun"]:
+    aliyun = Aliyun(conf["aliyun-key"],
+                    conf["aliyun-secret"],
+                    conf["aliyun-bucket-endpoint"],
+                    conf["aliyun-bucket-name"])
+else:
+    aliyun = None

+ 11 - 1
configure/__init__.py

@@ -45,4 +45,14 @@ conf["about-me-project"] = _conf["info"]["project"]
 conf["about-me-skill"] = _conf["info"]["skill"]
 conf["about-me-skill"] = _conf["info"]["skill"]
 conf["about-me-read"] = _conf["info"]["read"]
 conf["about-me-read"] = _conf["info"]["read"]
 
 
-conf["foot-info"] = _conf["info"]["foot-info"]
+conf["foot-info"] = f'{_conf["info"]["foot-info"]} Power by HBlog'
+
+aliyun = _conf.get("aliyun")
+if aliyun is None:
+    conf["aliyun"] = False
+else:
+    conf["aliyun"] = True
+    conf["aliyun-key"] = aliyun["Key"]
+    conf["aliyun-secret"] = aliyun["Secret"]
+    conf["aliyun-bucket-endpoint"] = aliyun["Bucket-Endpoint"]
+    conf["aliyun-bucket-name"] = aliyun["Bucket-Name"]

BIN
requirements.txt


BIN
static/images/hello.jpg


+ 0 - 4
static/styles/index/hello.css

@@ -1,7 +1,3 @@
-body {
-    background-image: url("../../images/hello.jpg");
-}
-
 #base {
 #base {
     position: relative;
     position: relative;
 }
 }

+ 6 - 0
static/styles/oss/upload.css

@@ -0,0 +1,6 @@
+.upload-form {
+    background-color: white;
+    border-radius: 10px;
+    border: 2px solid #6b6882;
+    padding: 15px;
+}

+ 1 - 0
templates/auth/yours.html

@@ -44,6 +44,7 @@
                     {% endif %}
                     {% endif %}
                     {% if current_user.check_role('ConfigureSystem') %}
                     {% if current_user.check_role('ConfigureSystem') %}
                         <a class="card-link" href="{{ url_for('auth.role_page') }}"> 角色设置 </a>
                         <a class="card-link" href="{{ url_for('auth.role_page') }}"> 角色设置 </a>
+                        <a class="card-link" href="{{ url_for('oss.upload_page') }}"> 上传文件 </a>
                     {% endif %}
                     {% endif %}
                 </div>
                 </div>
             </div>
             </div>

+ 1 - 0
templates/index/hello.html

@@ -7,6 +7,7 @@
     <link href="{{ url_for('static', filename='styles/index/hello.css') }}" rel="stylesheet">
     <link href="{{ url_for('static', filename='styles/index/hello.css') }}" rel="stylesheet">
     <style>
     <style>
         body {
         body {
+            background-image: url("{{ url_for('oss.get_page', name="bg-img.jpg") }}");
             overflow-y: hidden;
             overflow-y: hidden;
             overflow-x: hidden;
             overflow-x: hidden;
         }
         }

+ 28 - 0
templates/oss/upload.html

@@ -0,0 +1,28 @@
+{% extends "base.html" %}
+
+{% block title %} 上传文件 {% endblock %}
+
+{% block style %}
+    {{ super() }}
+    <link href="{{ url_for('static', filename='styles/oss/upload.css') }}" rel="stylesheet">
+{% endblock %}
+
+{% block context %}
+    <section id="base" class="container mt-3">
+    <div class="row">
+        <div class="col-12 col-lg-6 offset-lg-3">
+            <form method="post" action="#" class="upload-form" enctype="multipart/form-data">
+                {{ UploadForm.hidden_tag() }}
+
+                <div class="form-group pb-2">
+                    {{ UploadForm.file(class="form-control") }}
+                </div>
+
+                <div class="text-right">
+                    {{ UploadForm.submit(class='btn btn-info mr-2') }}
+                </div>
+            </form>
+        </div>
+    </div>
+    </section>
+{% endblock %}

+ 2 - 1
view/__init__.py

@@ -4,8 +4,9 @@ from view.archive import ArchiveApp
 from view.msg import MsgApp
 from view.msg import MsgApp
 from view.about_me import AboutMeApp
 from view.about_me import AboutMeApp
 from view.auth import AuthApp
 from view.auth import AuthApp
+from view.oss import OSSApp
 
 
 
 
-class WebApp(IndexApp, DocxApp, ArchiveApp, MsgApp, AboutMeApp, AuthApp):
+class WebApp(IndexApp, DocxApp, ArchiveApp, MsgApp, AboutMeApp, AuthApp, OSSApp):
     def __init__(self, import_name):
     def __init__(self, import_name):
         super(WebApp, self).__init__(import_name)
         super(WebApp, self).__init__(import_name)

+ 1 - 1
view/auth.py

@@ -1,13 +1,13 @@
 from flask import Flask, Blueprint, render_template, redirect, flash, url_for, request, abort
 from flask import Flask, Blueprint, render_template, redirect, flash, url_for, request, abort
 from flask_login import login_required, login_user, current_user, logout_user
 from flask_login import login_required, login_user, current_user, logout_user
 from flask_mail import Mail
 from flask_mail import Mail
+from flask_wtf import FlaskForm
 from wtforms import StringField, PasswordField, BooleanField, SubmitField, ValidationError
 from wtforms import StringField, PasswordField, BooleanField, SubmitField, ValidationError
 from wtforms.validators import DataRequired, Length, EqualTo
 from wtforms.validators import DataRequired, Length, EqualTo
 from typing import Optional
 from typing import Optional
 
 
 from view.base import App
 from view.base import App
 from core.user import User, load_user_by_email
 from core.user import User, load_user_by_email
-from flask_wtf import FlaskForm
 from send_email import send_msg
 from send_email import send_msg
 
 
 auth = Blueprint("auth", __name__)
 auth = Blueprint("auth", __name__)

+ 54 - 0
view/oss.py

@@ -0,0 +1,54 @@
+from flask import Flask, Blueprint, redirect, render_template, request, abort, flash, url_for
+from flask_login import login_required, current_user
+from typing import Optional
+from flask_wtf import FlaskForm
+from wtforms import FileField, SubmitField
+from wtforms.validators import DataRequired
+
+from aliyun import aliyun
+from view.base import App
+
+oss = Blueprint("oss", __name__)
+app: Optional[Flask] = None
+
+
+class UploadForm(FlaskForm):
+    file = FileField("选择文件", validators=[DataRequired()])
+    submit = SubmitField("上传")
+
+
+@oss.before_request
+def check_aliyun():
+    if aliyun is None:
+        abort(404)
+        return
+
+
+@oss.route('get/<string:name>')
+def get_page(name: str):
+    return redirect(aliyun.shared_obj(name))
+
+
+@oss.route('upload', methods=["GET", "POST"])
+@login_required
+def upload_page():
+    if not current_user.check_role("ConfigureSystem"):
+        abort(403)
+        return
+
+    form = UploadForm()
+    if form.validate_on_submit():
+        file = request.files["file"]
+        aliyun.upload_file(file.filename, file)
+        flash(f"文件 {file.filename} 已上传: {url_for('oss.get_page', name=file.filename, _external=True)}")
+        return redirect(url_for("oss.upload_page"))
+    return render_template("oss/upload.html", UploadForm=form)
+
+
+class OSSApp(App):
+    def __init__(self, import_name):
+        super(OSSApp, self).__init__(import_name)
+
+        global app
+        app = self._app
+        app.register_blueprint(oss, url_prefix="/oss")