博客蓝图 — Flask 文档
博客蓝图
您将使用在编写身份验证蓝图时学到的相同技术来编写博客蓝图。 博客应该列出所有帖子,允许登录用户创建帖子,并允许帖子的作者编辑或删除它。
在实现每个视图时,保持开发服务器运行。 保存更改时,请尝试访问浏览器中的 URL 并对其进行测试。
蓝图
定义蓝图并在应用程序工厂中注册。
flaskr/blog.py
使用app.register_blueprint()
从工厂导入并注册蓝图。 在返回应用程序之前,将新代码放在工厂函数的末尾。
flaskr/__init__.py
与 auth 蓝图不同,博客蓝图没有 url_prefix
。 因此,index
视图将位于 /
,create
视图位于 /create
,依此类推。 博客是 Flaskr 的主要功能,因此博客索引将是主索引是有道理的。
但是,下面定义的 index
视图的端点将是 blog.index
。 一些身份验证视图引用了一个普通的 index
端点。 app.add_url_rule()
将端点名称 'index'
与 /
url 相关联,以便 url_for('index')
或 url_for('blog.index')
都可以工作,生成相同的 /
无论哪种方式的网址。
在另一个应用程序中,您可能会给博客蓝图一个 url_prefix
并在应用程序工厂中定义一个单独的 index
视图,类似于 hello
视图。 然后 index
和 blog.index
端点和 URL 将不同。
索引
该索引将显示所有帖子,最近的在最前面。 使用 JOIN
以便在结果中可以使用 user
表中的作者信息。
flaskr/blog.py
flaskr/templates/blog/index.html
当用户登录时,header
块会添加一个指向 create
视图的链接。 当用户是帖子的作者时,他们会看到指向该帖子的 update
视图的“编辑”链接。 loop.last
是一个在 Jinja for loops 中可用的特殊变量。 它用于在除了最后一个帖子之外的每个帖子之后显示一行,以在视觉上将它们分开。
创建
create
视图与 auth register
视图的工作方式相同。 要么显示表单,要么验证发布的数据并将该发布添加到数据库或显示错误。
您之前编写的 login_required
装饰器用于博客视图。 用户必须登录才能访问这些视图,否则他们将被重定向到登录页面。
flaskr/blog.py
flaskr/templates/blog/create.html
更新
update
和 delete
视图都需要通过 id
获取 post
并检查作者是否与登录用户匹配。 为了避免重复代码,您可以编写一个函数来获取 post
并从每个视图调用它。
flaskr/blog.py
abort()
将引发一个返回 HTTP 状态代码的特殊异常。 它需要一个可选的消息来显示错误,否则使用默认消息。 404
表示“未找到”,403
表示“禁止”。 (401
表示“未授权”,但您重定向到登录页面而不是返回该状态。)
定义了 check_author
参数,以便该函数可用于在不检查作者的情况下获取 post
。 如果您编写了一个视图来显示页面上的单个帖子,这将非常有用,而用户并不重要,因为他们没有修改帖子。
flaskr/blog.py
与您目前编写的视图不同,update
函数接受一个参数 id
。 这对应于路线中的 <int:id>
。 真正的 URL 看起来像 /1/update
。 Flask 将捕获 1
,确保它是一个 int
,并将其作为 id
参数传递。 如果您不指定 int:
而是指定 <id>
,它将是一个字符串。 要生成更新页面的 URL,需要将 url_for()
传递给 id
,以便它知道要填写的内容:url_for('blog.update', id=post['id'])
。 这也在上面的 index.html
文件中。
create
和 update
视图看起来非常相似。 主要区别在于 update
视图使用 post
对象和 UPDATE
查询而不是 INSERT
。 通过一些巧妙的重构,您可以对两个操作使用一个视图和模板,但对于本教程,将它们分开会更清晰。
flaskr/templates/blog/update.html
这个模板有两种形式。 第一个将编辑后的数据发布到当前页面 (/<id>/update
)。 另一个表单只包含一个按钮,并指定一个 action
属性,该属性改为发布到删除视图。 该按钮使用一些 JavaScript 在提交之前显示一个确认对话框。
模式 {{ request.form['title'] or post['title'] }}
用于选择表单中显示的数据。 当表单尚未提交时,原始 post
数据出现,但如果提交了无效表单数据,您希望显示该数据以便用户修复错误,因此使用 request.form
代替. request 是另一个在模板中自动可用的变量。
删除
删除视图没有自己的模板,删除按钮是 update.html
的一部分并发布到 /<id>/delete
URL。 由于没有模板,它只会处理 POST
方法,然后重定向到 index
视图。
flaskr/blog.py
恭喜,您现在已经完成了应用程序的编写! 花一些时间尝试浏览器中的所有内容。 然而,在项目完成之前还有更多工作要做。
继续使项目可安装。