浏览代码

feat: 设置Flask层面的缓存

SongZihuan 2 年之前
父节点
当前提交
4055e9fb12
共有 15 个文件被更改,包括 273 次插入225 次删除
  1. 3 0
      app/about_me.py
  2. 26 16
      app/app.py
  3. 3 0
      app/archive.py
  4. 2 0
      app/auth.py
  5. 5 0
      app/docx.py
  6. 4 0
      app/index.py
  7. 4 0
      app/msg.py
  8. 3 1
      configure/__init__.py
  9. 1 0
      main.py
  10. 8 6
      templates/about_me/about_me.html
  11. 31 29
      templates/archive/archive.html
  12. 53 49
      templates/docx/docx.html
  13. 9 7
      templates/error.html
  14. 75 73
      templates/index/index.html
  15. 46 44
      templates/msg/msg.html

+ 3 - 0
app/about_me.py

@@ -1,5 +1,7 @@
 from flask import Blueprint, render_template, current_app
 import app
+import main
+from configure import conf
 
 about_me = Blueprint("about_me", __name__)
 
@@ -12,6 +14,7 @@ def about_me_page():
 
 
 @about_me.context_processor
+@main.app.cache.cached(timeout=conf["CACHE_EXPIRE"], key_prefix="inject_base:about_me")
 def inject_base():
     """ about me 默认模板变量 """
     return {"top_nav": ["", "", "", "", "active", ""]}

+ 26 - 16
app/app.py

@@ -5,6 +5,7 @@ from flask import Flask, url_for, request, current_app, render_template, Respons
 from flask_mail import Mail
 from flask_login import LoginManager, current_user
 from flask.logging import default_handler
+from flask_caching import Cache
 from typing import Optional, Union
 
 import logging.handlers
@@ -14,14 +15,6 @@ from bs4 import BeautifulSoup
 from configure import conf
 from object.user import AnonymousUser, User
 
-from .index import index
-from .archive import archive
-from .docx import docx
-from .msg import msg
-from .oss import oss
-from .auth import auth
-from .about_me import about_me
-
 if conf["DEBUG_PROFILE"]:
     from werkzeug.middleware.profiler import ProfilerMiddleware
 
@@ -35,14 +28,6 @@ class HBlogFlask(Flask):
         if conf["DEBUG_PROFILE"]:
             self.wsgi_app = ProfilerMiddleware(self.wsgi_app, sort_by=("cumtime",))
 
-        self.register_blueprint(index, url_prefix="/")
-        self.register_blueprint(archive, url_prefix="/archive")
-        self.register_blueprint(docx, url_prefix="/docx")
-        self.register_blueprint(msg, url_prefix="/msg")
-        self.register_blueprint(auth, url_prefix="/auth")
-        self.register_blueprint(about_me, url_prefix="/about")
-        self.register_blueprint(oss, url_prefix="/oss")
-
         self.login_manager = LoginManager()
         self.login_manager.init_app(self)
         self.login_manager.anonymous_user = AnonymousUser  # 设置未登录的匿名对象
@@ -50,6 +35,14 @@ class HBlogFlask(Flask):
 
         self.mail = Mail(self)
 
+        self.cache = Cache(config={
+            'CACHE_TYPE': 'RedisCache',
+            'CACHE_KEY_PREFIX': 'flask_cache:',
+            'CACHE_REDIS_URL': f'redis://{conf["CACHE_REDIS_NAME"]}:{conf["CACHE_REDIS_PASSWD"]}@'
+                               f'{conf["CACHE_REDIS_HOST"]}:{conf["CACHE_REDIS_PORT"]}/{conf["CACHE_REDIS_DATABASE"]}'
+        })
+        self.cache.init_app(self)
+
         self.logger.removeHandler(default_handler)
         self.logger.setLevel(conf["LOG_LEVEL"])
         self.logger.propagate = False
@@ -78,6 +71,23 @@ class HBlogFlask(Flask):
                  f"\treturn Response(response=data, status={i})", func)
             self.errorhandler(i)(func[f"error_{i}"])
 
+    def register_all_blueprint(self):
+        from .index import index
+        from .archive import archive
+        from .docx import docx
+        from .msg import msg
+        from .oss import oss
+        from .auth import auth
+        from .about_me import about_me
+
+        self.register_blueprint(index, url_prefix="/")
+        self.register_blueprint(archive, url_prefix="/archive")
+        self.register_blueprint(docx, url_prefix="/docx")
+        self.register_blueprint(msg, url_prefix="/msg")
+        self.register_blueprint(auth, url_prefix="/auth")
+        self.register_blueprint(about_me, url_prefix="/about")
+        self.register_blueprint(oss, url_prefix="/oss")
+
     def update_configure(self):
         """ 更新配置 """
         self.config.update(conf)

+ 3 - 0
app/archive.py

@@ -6,6 +6,8 @@ from wtforms.validators import DataRequired, Length, ValidationError
 
 import app
 from object.archive import Archive
+import main
+from configure import conf
 
 archive = Blueprint("archive", __name__)
 
@@ -72,6 +74,7 @@ def delete_archive_page():
 
 
 @archive.context_processor
+@main.app.cache.cached(timeout=conf["CACHE_EXPIRE"], key_prefix="inject_base:archive")
 def inject():
     """ archive 默认模板变量 """
     return {"top_nav": ["", "active", "", "", "", ""]}

+ 2 - 0
app/auth.py

@@ -15,6 +15,7 @@ import app
 from object.user import User
 from send_email import send_msg
 from configure import conf
+import main
 
 auth = Blueprint("auth", __name__)
 
@@ -323,6 +324,7 @@ def role_set_page():
 
 
 @auth.context_processor
+@main.app.cache.cached(timeout=conf["CACHE_EXPIRE"], key_prefix="inject_base:auth")
 def inject_base():
     """ auth 默认模板变量 """
     return {"top_nav": ["", "", "", "", "", "active"]}

+ 5 - 0
app/docx.py

@@ -10,6 +10,8 @@ from sql.base import DBBit
 from object.blog import BlogArticle
 from object.comment import Comment
 from object.archive import Archive
+import main
+from configure import conf
 
 docx = Blueprint("docx", __name__)
 
@@ -110,6 +112,7 @@ def __load_docx_page(page: int, form: WriteBlogForm):
     app.HBlogFlask.print_load_page_log(f"docx list (page: {page})")
     return render_template("docx/docx.html",
                            page=page,
+                           cache_str=f":{page}",
                            blog_list=blog_list,
                            page_list=page_list,
                            form=form,
@@ -137,6 +140,7 @@ def archive_page():
     app.HBlogFlask.print_load_page_log(f"archive-docx list (archive-id: {archive} page: {page})")
     return render_template("docx/docx.html",
                            page=page,
+                           cache_str=f":{page}",
                            blog_list=blog_list,
                            is_top=DBBit.BIT_1,
                            page_list=page_list,
@@ -314,6 +318,7 @@ def delete_comment_page():
 
 
 @docx.context_processor
+@main.app.cache.cached(timeout=conf["CACHE_EXPIRE"], key_prefix="inject_base:docx")
 def inject_base():
     """ docx 默认模板变量 """
     return {"top_nav": ["", "", "active", "", "", ""]}

+ 4 - 0
app/index.py

@@ -5,11 +5,13 @@ from configure import conf
 import app
 from object.blog import BlogArticle
 from object.msg import Message
+import main  # 获得 app 对象
 
 index = Blueprint("base", __name__)
 
 
 @index.route('/')
+@main.app.cache.cached(timeout=conf["VIEW_CACHE_EXPIRE"])
 def hello_page():
     app.HBlogFlask.print_load_page_log(f"hello")
     return render_template("index/hello.html")
@@ -27,12 +29,14 @@ def index_page():
 
 
 @index.context_processor
+@main.app.cache.cached(timeout=conf["CACHE_EXPIRE"], key_prefix="inject_base:index")
 def inject_base():
     """ index默认模板变量, 覆盖app变量 """
     return {"top_nav": ["active", "", "", "", "", ""]}
 
 
 @index.app_context_processor
+@main.app.cache.cached(timeout=conf["CACHE_EXPIRE"], key_prefix="inject_base")
 def inject_base():
     """ app默认模板变量 """
     return {"blog_name": conf['BLOG_NAME'],

+ 4 - 0
app/msg.py

@@ -7,6 +7,8 @@ from wtforms.validators import DataRequired, Length
 import app
 from sql.base import DBBit
 from object.msg import Message
+import main
+from configure import conf
 
 msg = Blueprint("msg", __name__)
 
@@ -37,6 +39,7 @@ def __load_msg_page(page: int, form: WriteForm):
     return render_template("msg/msg.html",
                            msg_list=msg_list,
                            page=page,
+                           cache_str=f":{page}",
                            page_list=page_list,
                            form=form,
                            is_secret=DBBit.BIT_1,
@@ -82,6 +85,7 @@ def delete_msg_page():
 
 
 @msg.context_processor
+@main.app.cache.cached(timeout=conf["CACHE_EXPIRE"], key_prefix="inject_base:msg")
 def inject_base():
     """ msg 默认模板变量 """
     return {"top_nav": ["", "", "", "active", "", ""]}

+ 3 - 1
configure/__init__.py

@@ -1,7 +1,6 @@
 import json
 import logging
 import os
-
 conf = {
     "DEBUG_PROFILE": False,
     "SECRET_KEY": "HBlog-R-Salt",
@@ -27,6 +26,8 @@ conf = {
     "CACHE_REDIS_PASSWD": "123456",
     "CACHE_REDIS_DATABASE": 0,
     "CACHE_EXPIRE": 604800,  # 默认七天过期
+    "VIEW_CACHE_EXPIRE": 60,  # 视图函数
+    "LIST_CACHE_EXPIRE": 5,  # 列表 排行
     "CACHE_PREFIX": "hblog_cache",
     "MAIL_SERVER": "",
     "MAIL_PORT": "",
@@ -56,6 +57,7 @@ conf = {
 }
 
 
+
 def configure(conf_file: str, encoding="utf-8"):
     """ 运行配置程序, 该函数需要在其他模块被执行前调用 """
     with open(conf_file, mode="r", encoding=encoding) as f:

+ 1 - 0
main.py

@@ -15,6 +15,7 @@ from app import HBlogFlask
 from waitress import serve
 
 app = HBlogFlask(__name__)
+app.register_all_blueprint()
 
 if __name__ == '__main__':
     logging.info("Server start on 127.0.0.1:8080")

+ 8 - 6
templates/about_me/about_me.html

@@ -7,11 +7,13 @@
 {% endblock %}
 
 {% block content %}
-    <section id="base" class="container mt-3">
-    <div class="row">
-        <div class="col-12">
-            {{ about_me | safe }}
+    {% cache conf["CACHE_EXPIRE"], ":about_me" %}
+        <section id="base" class="container mt-3">
+        <div class="row">
+            <div class="col-12">
+                {{ about_me | safe }}
+            </div>
         </div>
-    </div>
-    </section>
+        </section>
+    {% endcache %}
 {% endblock %}

+ 31 - 29
templates/archive/archive.html

@@ -47,37 +47,39 @@
         </div>
     {% endif %}
 
-    <section id="base" class="d-flex mt-3 container justify-content-center flex-wrap">
-        {% for archive in archive_list %}
-            <div class="archive mb-3 mx-2">
-                <h3> {{ archive.name }} </h3>
-                <hr>
-                <p class="archive_describe"> {{ archive.describe }} </p>
-                <p> 篇数: {{ archive.count }} </p>
-                <a class="btn btn-primary" href="{{ url_for("docx.archive_page", archive=archive.id, page=1) }}"> 进入 </a>
-                {% if show_delete %}
-                    <div id="DeleteModal{{archive.id}}" class="modal fade" role="dialog" aria-hidden="true">
-                        <div class="modal-dialog">
-                            <div class="modal-content text-start">
-                                <div class="modal-header">
-                                    <h4 class="modal-title"> 确认删除归档? </h4>
-                                </div>
-                                <div class="modal-body">
-                                    <p> 是否确认删除归档 {{ archive.name }}? </p>
-                                </div>
-                                <div class="modal-footer">
-                                    <a class="btn btn-danger"
-                                       href="{{ url_for("archive.delete_archive_page", archive=archive.id) }}"> 删除 </a>
-                                    <button type="button" class="btn btn-outline-dark" data-bs-dismiss="modal"> 取消 </button>
+    {% cache conf["LIST_CACHE_EXPIRE"], ":archive", ":list" %}
+        <section id="base" class="d-flex mt-3 container justify-content-center flex-wrap">
+            {% for archive in archive_list %}
+                <div class="archive mb-3 mx-2">
+                    <h3> {{ archive.name }} </h3>
+                    <hr>
+                    <p class="archive_describe"> {{ archive.describe }} </p>
+                    <p> 篇数: {{ archive.count }} </p>
+                    <a class="btn btn-primary" href="{{ url_for("docx.archive_page", archive=archive.id, page=1) }}"> 进入 </a>
+                    {% if show_delete %}
+                        <div id="DeleteModal{{archive.id}}" class="modal fade" role="dialog" aria-hidden="true">
+                            <div class="modal-dialog">
+                                <div class="modal-content text-start">
+                                    <div class="modal-header">
+                                        <h4 class="modal-title"> 确认删除归档? </h4>
+                                    </div>
+                                    <div class="modal-body">
+                                        <p> 是否确认删除归档 {{ archive.name }}? </p>
+                                    </div>
+                                    <div class="modal-footer">
+                                        <a class="btn btn-danger"
+                                           href="{{ url_for("archive.delete_archive_page", archive=archive.id) }}"> 删除 </a>
+                                        <button type="button" class="btn btn-outline-dark" data-bs-dismiss="modal"> 取消 </button>
+                                    </div>
                                 </div>
                             </div>
                         </div>
-                    </div>
 
-                    <button type="button" class="btn btn-danger"
-                            data-bs-toggle="modal" data-bs-target="#DeleteModal{{archive.id}}"> 删除归档 </button>
-                {% endif %}
-            </div>
-        {% endfor %}
-    </section>
+                        <button type="button" class="btn btn-danger"
+                                data-bs-toggle="modal" data-bs-target="#DeleteModal{{archive.id}}"> 删除归档 </button>
+                    {% endif %}
+                </div>
+            {% endfor %}
+        </section>
+    {% endcache %}
 {% endblock %}

+ 53 - 49
templates/docx/docx.html

@@ -57,60 +57,64 @@
 
         {% if current_user.check_role("ReadBlog") %}
             {# 检查是否具有读取权限 #}
-            <div id="ReadBlogList" class="row">
-                <article class="col-12">
-                {% for blog in blog_list %}
-                    {% if show_delete %}
-                        {# 判断是否显示删除模态框 #}
-                        <div id="DeleteModal{{blog.id}}" class="modal fade" role="dialog" aria-hidden="true">
-                            <div class="modal-dialog">
-                                <div class="modal-content text-start">
-                                    <div class="modal-header">
-                                        <h4 class="modal-title"> 确认删除博文? </h4>
-                                    </div>
-                                    <div class="modal-body">
-                                        <p> 是否确认删除博文 {{ blog.title }}? </p>
-                                    </div>
-                                    <div class="modal-footer">
-                                        <a class="btn btn-danger"
-                                           href="{{ url_for("docx.delete_blog_page", blog=blog.id) }}"> 删除 </a>
-                                        <button type="button" class="btn btn-outline-dark" data-bs-dismiss="modal"> 取消 </button>
+            {% cache conf["LIST_CACHE_EXPIRE"], ":blog", ":page", cache_str %}
+                <div id="ReadBlogList" class="row">
+                    <article class="col-12">
+                    {% for blog in blog_list %}
+                        {% if show_delete %}
+                            {# 判断是否显示删除模态框 #}
+                            <div id="DeleteModal{{blog.id}}" class="modal fade" role="dialog" aria-hidden="true">
+                                <div class="modal-dialog">
+                                    <div class="modal-content text-start">
+                                        <div class="modal-header">
+                                            <h4 class="modal-title"> 确认删除博文? </h4>
+                                        </div>
+                                        <div class="modal-body">
+                                            <p> 是否确认删除博文 {{ blog.title }}? </p>
+                                        </div>
+                                        <div class="modal-footer">
+                                            <a class="btn btn-danger"
+                                               href="{{ url_for("docx.delete_blog_page", blog=blog.id) }}"> 删除 </a>
+                                            <button type="button" class="btn btn-outline-dark" data-bs-dismiss="modal"> 取消 </button>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
-                        </div>
-                    {% endif %}
+                        {% endif %}
 
-                    {% if blog.top %}
-                        <div class="docx-top">
-                            <a class="h4 my-auto" href="{{ url_for("docx.article_page", blog=blog.id) }}">
-                            {{ blog.title }}
-                                <small> {{ blog.subtitle }}
-                                    <small> {{ blog.update_time }} / {{ blog.create_time }} </small> </small> </a>
-                            {% if show_delete %}
-                                <button type="button" class="btn btn-sm btn-danger my-auto btn-close float-end"
-                                    data-bs-toggle="modal" data-bs-target="#DeleteModal{{blog.id}}"> </button>
-                            {% endif %}
-                        </div>
-                    {% else %}
-                        <div class="docx">
-                            <a class="h4 my-auto" href="{{ url_for("docx.article_page", blog=blog.id) }}">
-                            {{ blog.title }}
-                                <small> {{ blog.subtitle }}
-                                    <small> {{ blog.update_time }} / {{ blog.create_time }} </small> </small> </a>
-                            {% if show_delete %}
-                                <button type="button" class="btn btn-sm btn-danger my-auto btn-close float-end"
-                                    data-bs-toggle="modal" data-bs-target="#DeleteModal{{blog.id}}"> </button>
-                            {% endif %}
-                        </div>
-                    {% endif %}
-                {% endfor %}
-                </article>
-            </div>
+                        {% if blog.top %}
+                            <div class="docx-top">
+                                <a class="h4 my-auto" href="{{ url_for("docx.article_page", blog=blog.id) }}">
+                                {{ blog.title }}
+                                    <small> {{ blog.subtitle }}
+                                        <small> {{ blog.update_time }} / {{ blog.create_time }} </small> </small> </a>
+                                {% if show_delete %}
+                                    <button type="button" class="btn btn-sm btn-danger my-auto btn-close float-end"
+                                        data-bs-toggle="modal" data-bs-target="#DeleteModal{{blog.id}}"> </button>
+                                {% endif %}
+                            </div>
+                        {% else %}
+                            <div class="docx">
+                                <a class="h4 my-auto" href="{{ url_for("docx.article_page", blog=blog.id) }}">
+                                {{ blog.title }}
+                                    <small> {{ blog.subtitle }}
+                                        <small> {{ blog.update_time }} / {{ blog.create_time }} </small> </small> </a>
+                                {% if show_delete %}
+                                    <button type="button" class="btn btn-sm btn-danger my-auto btn-close float-end"
+                                        data-bs-toggle="modal" data-bs-target="#DeleteModal{{blog.id}}"> </button>
+                                {% endif %}
+                            </div>
+                        {% endif %}
+                    {% endfor %}
+                    </article>
+                </div>
+
+
+                <ul id="ReadBlogPageList" class="pagination col-12 justify-content-center">
+                    {{ macro.get_page_list(page_list, page) }}
+                </ul>
 
-            <ul id="ReadBlogPageList" class="pagination col-12 justify-content-center">
-                {{ macro.get_page_list(page_list, page) }}
-            </ul>
+            {% endcache %}
 
         {% endif %}
     </section>

+ 9 - 7
templates/error.html

@@ -8,12 +8,14 @@
 {% endblock %}
 
 {% block content %}
-    <section id="base" class="container mt-3">
-        <div class="row">
-            <div class="col-12 text-center">
-                <p><strong> {{ error_info }} </strong></p>
-                <a class="btn btn-warning" href="{{ url_for("base.index_page") }}"> 回到主页 </a>
+    {% cache conf["CACHE_EXPIRE"], ":error" %}
+        <section id="base" class="container mt-3">
+            <div class="row">
+                <div class="col-12 text-center">
+                    <p><strong> {{ error_info }} </strong></p>
+                    <a class="btn btn-warning" href="{{ url_for("base.index_page") }}"> 回到主页 </a>
+                </div>
             </div>
-        </div>
-    </section>
+        </section>
+    {% endcache %}
 {% endblock %}

+ 75 - 73
templates/index/index.html

@@ -8,81 +8,83 @@
 {% endblock %}
 
 {% block content %}
-    <section id="base" class="container mt-3">
-        <div class="row">
-            <article class="col-12">
-                <div class="introduce mx-lg-2">
-                    {% for info in conf['INTRODUCE'] %}
-                        <h2> {{ info[0] }} </h2>
-                        {{ info[1] | safe }}
-                    {% endfor %}
+    {% cache conf["VIEW_CACHE_EXPIRE"], ":index" %}
+        <section id="base" class="container mt-3">
+            <div class="row">
+                <article class="col-12">
+                    <div class="introduce mx-lg-2">
+                        {% for info in conf['INTRODUCE'] %}
+                            <h2> {{ info[0] }} </h2>
+                            {{ info[1] | safe }}
+                        {% endfor %}
 
-                    {% for link in conf['INTRODUCE_LINK'] %}
-                        <a class="btn btn-outline-info mb-2" href="{{ conf['INTRODUCE_LINK'][link] }}"> {{ link }} </a>
-                    {% endfor %}
-                </div>
-            </article>
-        </div>
-        <div class="row">
-            {% if current_user.check_role("ReadBlog") %}  {# 检查是否具有读取权限 #}
-                {% if current_user.check_role("ReadMsg") %}
-                    <article class="col-12 col-lg-8">
-                    {% for blog in blog_list %}
-                        <div class="docx ms-lg-2"> <a class="h4"
-                                                      href="{{ url_for("docx.article_page", blog=blog.id) }}">
-                            {{ blog.title }}
-                                <small> {{ blog.subtitle }}
-                                    <small> {{ blog.update_time }} / {{ blog.create_time }} </small> </small> </a></div>
-                    {% endfor %}
-                    </article>
-                {% else %}
-                    <article class="col-12">
-                    {% for blog in blog_list %}
-                        <div class="docx"> <a class="h4"
-                                              href="{{ url_for("docx.article_page", blog=blog.id) }}">
-                            {{ blog.title }}
-                                <small> {{ blog.subtitle }}
-                                    <small> {{ blog.update_time }} / {{ blog.create_time }} </small> </small> </a></div>
-                    {% endfor %}
-                    </article>
+                        {% for link in conf['INTRODUCE_LINK'] %}
+                            <a class="btn btn-outline-info mb-2" href="{{ conf['INTRODUCE_LINK'][link] }}"> {{ link }} </a>
+                        {% endfor %}
+                    </div>
+                </article>
+            </div>
+            <div class="row">
+                {% if current_user.check_role("ReadBlog") %}  {# 检查是否具有读取权限 #}
+                    {% if current_user.check_role("ReadMsg") %}
+                        <article class="col-12 col-lg-8">
+                        {% for blog in blog_list %}
+                            <div class="docx ms-lg-2"> <a class="h4"
+                                                          href="{{ url_for("docx.article_page", blog=blog.id) }}">
+                                {{ blog.title }}
+                                    <small> {{ blog.subtitle }}
+                                        <small> {{ blog.update_time }} / {{ blog.create_time }} </small> </small> </a></div>
+                        {% endfor %}
+                        </article>
+                    {% else %}
+                        <article class="col-12">
+                        {% for blog in blog_list %}
+                            <div class="docx"> <a class="h4"
+                                                  href="{{ url_for("docx.article_page", blog=blog.id) }}">
+                                {{ blog.title }}
+                                    <small> {{ blog.subtitle }}
+                                        <small> {{ blog.update_time }} / {{ blog.create_time }} </small> </small> </a></div>
+                        {% endfor %}
+                        </article>
+                    {% endif %}
                 {% endif %}
-            {% endif %}
 
-            {% if current_user.check_role("ReadMsg") %}  {# 检查是否具有读取权限 #}
-                {% if current_user.check_role("ReadBlog") %}
-                    <aside class="col-12 col-lg-4">
-                    {% for msg in msg_list %}
-                        <div class="msg me-0 me-lg-2">
-                            <p class="msg-title h5">
-                                {% if show_email %}  {# 判断是否可读取用户信息 #}
-                                    {{ msg.auth.email }}
-                                {% else %}
-                                    {{ msg.auth.star_email }}
-                                {% endif %}
-                                <br> <small>
-                                {{ msg.update_time }} </small> </p>
-                            <p> {{ msg.content.replace('\n', '<br>') | safe }} </p>
-                        </div>
-                    {% endfor %}
-                    </aside>
-                {% else %}
-                    <aside class="col-12">
-                    {% for msg in msg_list %}
-                        <div class="msg">
-                            <p class="msg-title h5">
-                                {% if show_email %}  {# 判断是否可读取用户信息 #}
-                                    {{ msg.auth.email }}
-                                {% else %}
-                                    {{ msg.auth.star_email }}
-                                {% endif %}
-                                <br> <small>
-                                {{ msg.update_time }} </small> </p>
-                            <p> {{ msg.content.replace('\n', '<br>') | safe }} </p>
-                        </div>
-                    {% endfor %}
-                    </aside>
+                {% if current_user.check_role("ReadMsg") %}  {# 检查是否具有读取权限 #}
+                    {% if current_user.check_role("ReadBlog") %}
+                        <aside class="col-12 col-lg-4">
+                        {% for msg in msg_list %}
+                            <div class="msg me-0 me-lg-2">
+                                <p class="msg-title h5">
+                                    {% if show_email %}  {# 判断是否可读取用户信息 #}
+                                        {{ msg.auth.email }}
+                                    {% else %}
+                                        {{ msg.auth.star_email }}
+                                    {% endif %}
+                                    <br> <small>
+                                    {{ msg.update_time }} </small> </p>
+                                <p> {{ msg.content.replace('\n', '<br>') | safe }} </p>
+                            </div>
+                        {% endfor %}
+                        </aside>
+                    {% else %}
+                        <aside class="col-12">
+                        {% for msg in msg_list %}
+                            <div class="msg">
+                                <p class="msg-title h5">
+                                    {% if show_email %}  {# 判断是否可读取用户信息 #}
+                                        {{ msg.auth.email }}
+                                    {% else %}
+                                        {{ msg.auth.star_email }}
+                                    {% endif %}
+                                    <br> <small>
+                                    {{ msg.update_time }} </small> </p>
+                                <p> {{ msg.content.replace('\n', '<br>') | safe }} </p>
+                            </div>
+                        {% endfor %}
+                        </aside>
+                    {% endif %}
                 {% endif %}
-            {% endif %}
-        </div>
-    </section>
+            </div>
+        </section>
+    {% endcache %}
 {% endblock %}

+ 46 - 44
templates/msg/msg.html

@@ -48,58 +48,60 @@
         </div>
         <hr>
         {% if current_user.check_role("ReadMsg") %}  {# 检查是否具有读取权限 #}
-            <div class="row">
-                <section class="col-12">
-                    {% for msg in msg_list %}
-                        <div class="msg me-0">
-                            {% if show_delete %}
-                                <div id="DeleteModal{{msg.id }}" class="modal fade" role="dialog" aria-hidden="true">
-                                    <div class="modal-dialog">
-                                        <div class="modal-content text-start">
-                                            <div class="modal-header">
-                                                <h4 class="modal-title"> 确认删除留言? </h4>
-                                            </div>
-                                            <div class="modal-body">
-                                                <p> 是否确认删除留言? </p>
-                                            </div>
-                                            <div class="modal-footer">
-                                                <a class="btn btn-danger"
-                                                   href="{{ url_for("msg.delete_msg_page", msg=msg.id) }}"> 删除 </a>
-                                                <button type="button" class="btn btn-outline-dark" data-bs-dismiss="modal"> 取消 </button>
+            {% cache conf["LIST_CACHE_EXPIRE"], ":msg", ":page", cache_str %}
+                <div class="row">
+                    <section class="col-12">
+                        {% for msg in msg_list %}
+                            <div class="msg me-0">
+                                {% if show_delete %}
+                                    <div id="DeleteModal{{msg.id }}" class="modal fade" role="dialog" aria-hidden="true">
+                                        <div class="modal-dialog">
+                                            <div class="modal-content text-start">
+                                                <div class="modal-header">
+                                                    <h4 class="modal-title"> 确认删除留言? </h4>
+                                                </div>
+                                                <div class="modal-body">
+                                                    <p> 是否确认删除留言? </p>
+                                                </div>
+                                                <div class="modal-footer">
+                                                    <a class="btn btn-danger"
+                                                       href="{{ url_for("msg.delete_msg_page", msg=msg.id) }}"> 删除 </a>
+                                                    <button type="button" class="btn btn-outline-dark" data-bs-dismiss="modal"> 取消 </button>
+                                                </div>
                                             </div>
                                         </div>
                                     </div>
-                                </div>
-                            {% endif %}
-
-                            <p class="msg-title h5">
-                                {% if show_email %}  {# 判断是否可读取用户信息 #}
-                                    {{ msg.auth.email }}
-                                {% else %}
-                                    {{ msg.auth.star_email }}
                                 {% endif %}
 
-                                {% if show_delete %}
-                                    <a class="mb-2"
-                                        data-bs-toggle="modal" data-bs-target="#DeleteModal{{msg.id }}"> &times; </a>
-                                {% endif %}
+                                <p class="msg-title h5">
+                                    {% if show_email %}  {# 判断是否可读取用户信息 #}
+                                        {{ msg.auth.email }}
+                                    {% else %}
+                                        {{ msg.auth.star_email }}
+                                    {% endif %}
 
-                                <br>
-                                <small> {{ msg.update_time }}
-                                    {% if msg.secret == is_secret %}
-                                        <small> [私密留言] </small>
+                                    {% if show_delete %}
+                                        <a class="mb-2"
+                                            data-bs-toggle="modal" data-bs-target="#DeleteModal{{msg.id }}"> &times; </a>
                                     {% endif %}
-                                </small>
-                            </p>
-                            <p> {{ msg.content.replace('\n', '<br>') | safe }} </p>
-                        </div>
-                    {% endfor %}
-                </section>
-            </div>
 
-            <ul class="pagination col-12 justify-content-center">
-                {{ macro.get_page_list(page_list, page) }}
-            </ul>
+                                    <br>
+                                    <small> {{ msg.update_time }}
+                                        {% if msg.secret == is_secret %}
+                                            <small> [私密留言] </small>
+                                        {% endif %}
+                                    </small>
+                                </p>
+                                <p> {{ msg.content.replace('\n', '<br>') | safe }} </p>
+                            </div>
+                        {% endfor %}
+                    </section>
+                </div>
+
+                <ul class="pagination col-12 justify-content-center">
+                    {{ macro.get_page_list(page_list, page) }}
+                </ul>
+            {% endcache %}
         {% endif %}
     </section>
 {% endblock %}