Flask狼书笔记 | 08_个人博客(上)

这篇具有很好参考价值的文章主要介绍了Flask狼书笔记 | 08_个人博客(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flask狼书笔记 | 08_个人博客(上),学而时习之,flask,笔记,python,工厂方法模式

8 个人博客

个人博客是一个典型的CMS(内容管理系统),通常包含前台和后台两部分。这一张将涉及更高级的项目组织方式,以及一些新的Python包:Flask-LoginUnidecode

8.1 大型项目结构

本章将学习使用蓝本,和工厂函数,来进一步组织Flask程序。当一个模块中有太多代码时,常用的做法是将单一模块升级为包。新版本的目录结构如下:

blueblog/
	blueprints/
		- __init__.py
		- blog.py
		- auth.py
		- admin.py
	templates/
		- admin/
		- auth/
		- blog/
		- base.html
		- macros.html
	static/
	__init__.py
	forms.py
	models.py
	...

蓝本提供了更强大的代码组织能力,可以在程序功能层面模块化代码,而不仅仅是代码组织层面。

1、使用蓝本模块化程序

我们可以为蓝本实例注册路由、函数等等,使用上和程序实例很相似,但实际上是不同的。蓝本只是一个模子,把蓝本中的操作附加到程序上,这些操作才能够发挥作用。

  • 创建蓝本
auth_bp = BluePrint('auth', __name__)

使用errorhandler()装饰器可以把错误处理函数注册到蓝本上。你也可以在蓝本上注册视图函数、请求处理函数、模板上下文处理函数,此时他们都只在蓝本局部发生作用。(p223)

  • 注册蓝本

蓝本要注册到程序实例上,才能发挥作用。url_prefix会各所有注册在蓝本上的视图函数,添加一个url前缀。

app.register_blueprint(auth_bp, url_prefix='/auth')

查看当前程序注册的所有路由flask route

  • 端点:使用蓝本.视图函数名的方式访问。
  • 资源

将蓝本模块升级为包,则可以在其中创建蓝本独有的static/文件夹和templates/文件夹。在创建蓝本时需要指定他们:

auth_bp = Blueprint('auth', __name__, static_folder='static', templates_folder='templates')

2、使用类组织配置

可以将配置写作类属性,通过继承即可派生不同的配置组合。

class BaseConfig(object):
    SECRET_KEY = ...
    ...
    
class DevelopmentConfig(BaseConfig):
    ...

config = {
    'base': BaseConfig,
    'development': DevelopmentConfig
}

然后从类导入配置:

config_name = os.getenv('FLASK_CONFIG', 'development')
app.config.from_object(config[config_name])

3、使用工厂函数创建程序实例(p229)

这里的工厂函数,即函数的返回值是程序实例,使用它可以在任何地方创建程序实例。

def create_app(config_name=None):
    ...
    app = Flask('bluelog')
    app.config.from_object(config[config_name])
    
    app.register_blueprint(blog_bp)
    return app

实例化扩展对象时需要传入app程序实例,但使用工厂函数并没有一个创建好的程序实例以传入(也不需要有)。扩展对象一般提供了init_app()方法,可以在其它模块中创建扩展对象,然后在工厂函数中完成初始化。

启动程序:在flask run命令运行时,会在FLASK_APP指定处寻找名为create_app()或者make_app()的工厂函数,自动调用工厂函数创建程序实例。

current_app:可以在工厂函数外调用程序实例独有的属性,如app.config。当实例被创建并运行时,它会自动指向程序实例,转发操作到实例。

8.2 编写程序骨架

这一章的笔记,我主要会记录一些需要注意的小点,会比较零散。

本书BlueBlog的功能分为三个部分:博客前台、用户认证、博客后台。

1、数据库

  • 邻接列表关系

博客程序中的评论要支持回复,而回复本身可以算作是评论的一种,因此我们可以定义一种模型内部的一对多关系,每个评论对象可以包含多个子评论(回复)。

class Comment(db.Model):
    ...
    replied_id = db.Column(db.Integer, db.ForeignKey('comment.id'))
    
    replied = db.relationship('Comment', back_populates='replies', remote_side=[id])
    replies = db.relatoinship('Comment', back_populates='replied', cascade='all')

由于关系的两侧都在同一个模型,SQLAlchemy无法分辨关系的两侧(应该指在调用relationship时)。remote_side=[id]id字段设置为该relationship关系的远程侧,则replied_id字段作为关系的本地侧。即将replied字段作为关系中“多”的一方的属性(一对多关系总是在“多”的一方定义外键)。

这一节好像有点绕,但我感觉比较重要。

  • 生成虚拟数据:(p236)

2、模板

主题:Bootstrap除了使用默认的样式,一些网站上还提供了许多免费的主题,如Bootswatch、StartBootstrap。(p242)

  • 模板上下文:在基模板中使用的数据,为了避免在每个视图函数中都传入一次(麻烦),可以注册模板上下文处理函数。
@app.context_processor
def make_template_context():
    ...
    return dict(...)

而我之前采用的方法是将数据存储在session中,如用户名和用户id,以此来判断登录状态。

  • 渲染导航链接:导航栏上的按钮应该在对应的页面显示激活状态。可以通过判断请求的端点来实现(p244),并可以包装成一个。不过,Bootstrap-Flask已经提供了一个宏:render_nav_item()

render_nav_item()宏的常用参数:(p245)

  • Flash消息分类:在调用flask()函数时可以传入消息的类别,见(p245)

3、表单

  • 下拉列表的选项(即<option>标签)通过参数choices指定。(p247)
  • “分类”的名称要求不能重复,可以定义一个行内验证器。(p248)
  • 使用Optional验证器来使字段可以为空。

4、电子邮件支持

如何发送电子邮件,前面的章节已经介绍过。但如果使用异步的方式发送邮件,由于我们的程序实例采用工厂模式构建,而新建线程时要求真正的程序对象来创建上下文。

app = current_app._get_current_object() # 获取被代理的真实对象

8.3 编写博客前台

1、分页显示文章列表

  • 截取正文开头:使用truncate过滤器。
  • 分页

将查询执行函数从all()换成paginate(),可以对查询进行分页并获取其中一页的数据。(p254)

page = request.args.get('page', 1, type=1)  # 获取哪一页的数据
per_page = 10  # 每一页的数量
pagination = Post.query.paginate(page, per_page=per_page)
posts = pagination.items()

Pagination类的属性:(p255)

  • 渲染分页部件

可以简单地设置上一页和下一页两个按钮,也可以使用bootstrap提供的render_page()render_pagination宏。

2、显示文章正文

如果使用了富文本编辑器,则正文内容的样式是通过HTML标签来实现的,而jinja2会默认自动过滤掉文本中的html代码。需要使用safe过滤器,让jinja2把这些文本当作html代码来渲染。

  • 文章固定链接

文章的链接常常是如http://example.com/post/120的样子,在后台使用文章id=120来查询文章。你也可以使用一个可读性更强的链接,比如将id换成文章的标题。(p259)

如果想要方便地分享文章,可以提供一个单击复制文章链接的功能。或者,使用社交网站提供的分享API,或直接使用第三方社交分享服务。

3、显示评论列表

评论可以设置在文章页面的底部,可以给评论也添加一个分页导航,还可以使用fragment关键字向分页按钮的链接中添加URL片段。这样在调整到另一页评论后,会自动跳转到文章下面的评论区域(而不用从文章标题手动滑到下面的评论区)。

{{ render_pagination(pagination, fragment='#comments') }}

url_for()与查询字符串:在使用url_for()函数构建url时,任何多余的关键字参数都会自动转化为查询字符串。使用request.args可以获取查询字符串。

4、网站主题切换

可以根据用户的选择加载不同的css文件,来实现主题的切换。这个主题选项可以存放在cookie中,因为每个用户会有不同的选择。文章来源地址https://www.toymoban.com/news/detail-709584.html


到了这里,关于Flask狼书笔记 | 08_个人博客(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flask狼书笔记 | 05_数据库

    这一章学习如何在Python中使用DBMS(数据库管理系统),来对数据库进行管理和操作。本书使用 SQLite 作为示例。 注 :按下 Ctrl+F5 ,或 Shift+F5 可以清除浏览器缓存。 分为SQL(Structured Query Language)数据库和NoSQL(Not Only SQL)数据库。 SQL :稍显复杂,但不容易出错,可以适应大

    2024年02月09日
    浏览(32)
  • Flask狼书笔记 | 01_初识Flask,02_Flask与HTTP

    2023-8-11 以前对网站开发萌生了想法,又有些急于求成,在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣,存在许多模糊或不太理解的地方,只会照葫芦画瓢。 而当自己想开发一个什么网站的时,就如同摸着石头过河,常在许多小问题上卡住

    2024年02月11日
    浏览(32)
  • Flask Web开发实战(狼书)| 笔记第1、2章

    2023-8-11 以前对网站开发萌生了想法,又有些急于求成,在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣,存在许多模糊或不太理解的地方,只会照葫芦画瓢。 而当自己想开发一个什么网站的时,就如同摸着石头过河,常在许多小问题上卡住

    2024年02月12日
    浏览(38)
  • 个人博客项目笔记_01

    前端的工程运行流程: 进入项目目录执行cmd命令: 若是第一次启动需要依次输入如下命令: 之后直接执行 npm run dev 即可! 新建maven工程blog作为父工程,然后在父工程中创建子工程blog-api 向父工程的pom.xml文件中导入依赖。 在子工程的resources文件夹下创建application.properties文

    2024年04月08日
    浏览(92)
  • 如何使用Docker部署开源Leanote蚂蚁笔记并发布个人博客至公网

    最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 本篇文章介绍如何使用Docker部署Leanote蚂蚁笔记,并且结合cpolar内网穿透实现公网远程访

    2024年02月22日
    浏览(51)
  • Python 08学习之文件操作

    😀前言 欢迎来到Python 08学习之文件操作。在本文中,我们将介绍计算机中常见的文本文件和二进制文件,并探讨在Python中操作文件的步骤和相关函数/方法。通过学习本文,您将能够了解如何使用Python打开、读取、写入和关闭文件,以及如何按行读取文件内容。希望您能够通

    2024年02月04日
    浏览(37)
  • flask web学习之flask与http(四)

    一、重定向进阶功能 1.1 重定向回上一个页面 有时候,我们在某些界面执行操作一些操作后,不希望界面跳转到其他指定网页上,而希望网页能重定向为用户刚才浏览的界面,以便继续完成操作,例如在某个页面需要登录后才能进行操作,我们希望登录后不跳转到主页界面,

    2024年02月03日
    浏览(36)
  • 个人博客系统|基于Springboot的个人博客系统设计与实现(源码+数据库+文档)

    个人博客系统目录 目录 基于Springboot的个人博客系统设计与实现 一、前言 二、系统功能设计  三、系统实现 1、管理员功能实现 (1)用户管理 (2)文章分类管理 (3)公告信息管理 (4)博主信息管理 2、博主功能实现 (1)博主文章管理 3、用户功能实现 (1)博主文章信

    2024年04月13日
    浏览(47)
  • 四、Flask学习之JavaScript

    JavaScript ,作为一种前端脚本语言,赋予网页生动的交互性和动态性。通过它,开发者能够操作DOM(文档对象模型)实现页面元素的动态改变、响应用户事件,并借助AJAX技术实现异步数据请求,为用户提供更流畅的浏览体验。在现代Web开发中,JavaScript不仅是构建丰富用户界面

    2024年01月24日
    浏览(43)
  • 一、Flask学习之HTML

    首先需要搭建环境: app = Flask(__name__) : 创建了一个Flask应用实例, __name__ 参数表示当前模块的名称,通常用于确定资源的位置。 @app.route(\\\'/show/info\\\') : 这是一个装饰器,将下面的 index() 函数与指定的路由 /show/info 关联起来。当用户访问这个路由时,将执行 index() 函数。 运行会

    2024年01月21日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包