Day 21 实作路径结构

前言

今天我们要来开始写路径,也就是说在今天写完之後我们就可以把之前蓝图的注解取消了。

main_bp

首先,我们来看看最简单的 main_bp,里面基本上只有一个路径,就是首页。

在开始之前,我们要先在 app/main/ 里面加一个 views.py,等等路径会写在这里面。

__init__.py


from flask import Blueprint

main_bp = Blueprint("main", __name__)

from . import views

views.py

from werkzeug.exceptions import HTTPException
from . import main_bp


@main_bp.route("/", methods=["GET"])
def index_page():
    pass


@main_bp.app_errorhandler(401)
def handler_401(e):
    pass


@main_bp.app_errorhandler(HTTPException)
def handler(e):
    pass

这边的 __init__.py 跟很久以前写的有一点点不太一样,多加了一行 from . import views,这样他才会被好好 register 进 app

接下来看到 views.py,要特别注意,我们是用 main_bp 来注册路径,而不是 app,所以我们也需要从刚刚的 __init__.py 里面引入 main_bp。里面有一个 index_page,我们不会拿它来干嘛,就是一个放好看的页面而已,也不会有甚麽表单,所以 methods 就只有最简单的 GET

再来是两个 app_error_handler,他们就是用来处理错误的。第一个是处理 401 错误,也就是未验证,之前在写测试的时候有说过我们要让他直接重新导向至登入页面。剩下的错误就交给第二个,我们用 HTTPException 来接收,我们之後会写一个模板给他,让不管什麽错误都可以回传模板。他们两个都有一个 e 作为参数,他就是那个错误本身,我们之後会在第二个 handler 用到他。

user_bp

接着要看到 user_bp,这里会有一堆跟使用者有关的路径,像是登入登出、贴文、使用者设定等等。跟刚刚一样,我们也需要一个 views.py,而这次路径比较多,所以也可以把他拆开来,但要记得,在 __init__.py 要把每一个路径档案都引入。

__init__.py

from flask import Blueprint

user_bp = Blueprint("user", __name__)

from . import views

views.py

from flask_login import login_required
from . import user_bp

@user_bp.route("/login", methods=["GET", "POST"])
def login_page():
    pass

@user_bp.route("/logout", methods=["GET"])
def logout_page():
    pass

@user_bp.route("/register", methods=["GET", "POST"])
def register_page():
    pass

@user_bp.route("/setting", methods=["GET", "POST"])
@login_required
def user_setting_page():
    pass

@user_bp.route("/post/add", methods=["GET", "POST"])
@login_required
def add_post_page():
    pass

@user_bp.route("/post/edit/<int:post_id>", methods=["GET", "POST"])
@login_required
def edit_post_page(post_id):
    pass

@user_bp.route("/post/delete/<int:post_id>", methods=["GET"])
@login_required
def delete_post_page(post_id):
    pass

@user_bp.route("/dashboard", methods=["GET", "POST"])
@login_required
def dashboard_page():
    pass

@user_bp.route("/comments", methods=["GET"])
@login_required
def comments_dashboard_page():
    pass

@user_bp.route("/posts", methods=["GET"])
@login_required
def all_posts_page():
    pass

@user_bp.route("/post/<int:post_id>", methods=["GET", "POST"])
@login_required
def view_post_page(post_id):
    pass

@user_bp.route("/@<username>/posts", methods=["GET"])
@login_required
def user_posts_page(username):
    pass

这边路径很多,我们一个一个来解释。但开始讲路径之前,我们先来看看最前面的 login_required。顾名思义,他就是要求使用者要先登入才能进入这个网页,如果没登入的话就会丢出 401,那根据刚刚 main_bpapp_error_handler,他会重新导向到登入页面。但现在他还不能使用,因为我们还没有完成 FLask-Login 的一些要求,所以现在他会喷错误。

接下来就来看看各个路径要干嘛吧,我们会用路径来表示。

  • /login 当然就是登入页面,我们需要有 GET 和 POST,这样才能送表单出去。
  • /logout 是登出页面,戳一下系统就会把使用者登出。
  • /register 是注册页面,跟登入页面同理,也需要 GET 和 POST。
  • /setting 是使用者设定页面,一样需要提交表单,所以 GET 和 POST 都要。
  • 来到了贴文的部分,/post/add 是新增贴文的页面,也就是之前说要放 pagedown 表单的地方。这边当然需要做 login_required,除非要允许匿名发文。
  • /post/edit/<int:post_id> 是编辑贴文的地方,我们会跟新增贴文用一样的表单。但这边需要 post_id,这样才知道现在在修改哪一篇文章。
  • post/delete/<int:post_id> 会用来删除贴文,就像登出一样,戳一下文章就被删掉了。
  • /dashboard 是使用者看自己全部贴文的地方,因为有筛选器的表单,所以这里也需要 POST。
  • /comments 是使用者看自己全部留言的地方,但我们在这里没有做筛选器,所以就不需要 POST 了,
  • /posts 是看整个系统全部人文章的地方,也可以不要 login_required,这样匿名使用者也可以看到文章。
  • /post/<int:post_id> 则是看某一篇文章,後面的 post_id 会告诉系统要抓哪一篇文章出来。他也需要 POST,因为留言的表单会放在这里。
  • /@<username>/posts 是一个额外的东西,可以把该使用者的贴文全部抓出来。

admin_bp

最後我们来到了 admin_bp,比起刚刚,这里的路径就少了不少。这边有一些不太一样的路径,它们是只接收 POST、DELETE 等等 method,所以使用者不会直接去戳到他,而是要靠 JS 之类的东西来戳。

__init__.py

from flask import Blueprint

admin_bp = Blueprint("admin", __name__)

from . import views

views.py

from . import admin_bp


@admin_bp.route("/admin_dashboard/posts", methods=["GET", "POST"])
def admin_dashboard_posts_page():
    pass

@admin_bp.route("/admin_dashboard/comments", methods=["GET", "POST"])
def admin_dashboard_comments_page():
    pass

@admin_bp.route("/manage_user", methods=["GET", "POST"])
def manage_user_page():
    pass

@admin_bp.route("/admin_dashboard_posts_backend", methods=["DELETE"])
def admin_dashboard_posts_backend():
    pass

@admin_bp.route("/admin_dashboard_comments_backend", methods=["DELETE"])
def admin_dashboard_comments_backend():
    pass

@admin_bp.route("/manage_user_backend", methods=["PATCH", "DELETE"])
def manage_user_backend():
    pass

这里分成前面三个和後面三个,分别是给使用者用的和给 JS 戳的,所以後者我会等到真的在写的时候再详细讲,然後他们也是一一对应的。接下来就一个一个看看他们。

  • /admin_dashboard/posts 是给管理员看全部贴文的地方,同时也会允许管理员直接删除贴文,请求会由 JS 送到 admin_dashboard_posts_backend。他需要有 POST,因为有筛选器要用。
  • /admin_dashboard/comments 跟刚刚接近,只是是看留言的地方。也需要 POST,因为有筛选器。
  • /manage_user 是管理使用者的页面,可以看到所有使用者,然後也可以删除、更新 (manage_user_backend) 及新增 (表单)。

後记

在这边全部结束之後,我们就可以把之前 app/__init__.py 那些对於蓝图的注解移除,然後使用 flask shell 来看看 app.url_map 有没有一大堆东西,如果有那基本上就是成功了。


<<:  Day21:安全性和演算法-共用金钥密码系统(shared-key crypto system)

>>:  Day 6 - 架设 WireGuard Server

纵深防御(Defense in depth)

-NIST SP 800-160 V1和ISO 15288 NIST SP 800-160 V1强...

Git

最初,Linux Kernel 的社群采用压缩档或是补丁的方式进行维护工作。一直到 2002 年,开...

Day14:铁口直断

还记得当初应徵人生第一份软件工程师的Java笔试,那时候没有特别准备,但前面的一些类别物件概念都还能...

DAY17聚类演算法

昨天介绍完支持向量机,今天就要来介绍甚麽是分类和聚类: 通过将资料通过分类的方法分成不同的组别或者更...

使用模拟器

在Android Studio 启始画面的右下角,可以呼叫出AVD,这就是Android Virtu...