今天我们要来开始写路径,也就是说在今天写完之後我们就可以把之前蓝图的注解取消了。
首先,我们来看看最简单的 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
,这里会有一堆跟使用者有关的路径,像是登入登出、贴文、使用者设定等等。跟刚刚一样,我们也需要一个 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_bp
的 app_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
,比起刚刚,这里的路径就少了不少。这边有一些不太一样的路径,它们是只接收 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
-NIST SP 800-160 V1和ISO 15288 NIST SP 800-160 V1强...
最初,Linux Kernel 的社群采用压缩档或是补丁的方式进行维护工作。一直到 2002 年,开...
还记得当初应徵人生第一份软件工程师的Java笔试,那时候没有特别准备,但前面的一些类别物件概念都还能...
昨天介绍完支持向量机,今天就要来介绍甚麽是分类和聚类: 通过将资料通过分类的方法分成不同的组别或者更...
在Android Studio 启始画面的右下角,可以呼叫出AVD,这就是Android Virtu...