Flask搭建网站学习笔记

date
Mar 9, 2022
slug
python-flask-study
status
Published
tags
Python
summary
学习通过使用Python的Flask包来快速搭建网页
type
Post
此网站为本次笔记主要来源,以及更加详细内容这样直接去源站查看:

1 Flask概述

1.1 有关信息

1.1.1 Web应用程序框架(Web Application Framework)

Web应用程序框架或简单称为Web Framework表示库和模块的集合,使Web应用程序开发人员编写应用程序不用担心底层协议、线程管理等细节。

1.1.2 Flask

Flask是一个用Python编写的Web应用程序框架。由Armin Ronacher及其领导的国际Python爱好者团队Pocco开发。Flask也是基于Pocco团队的Werkzeug WSGI工具包和Jinja2模板引擎之上进行开发的。其中Werkzeug实现请求、响应对象和实用函数,jinja2作为流行的模板引擎,通过Web模板系统将模板与特定数据源组合以呈现动态网页。

1.1.3 WSGI(Web Server Gateway Interface)

WSGI全称为Web服务器网关接口,已被用于作为Python Web应用程序的开发标准。WSGI是web服务器和Web程序之间通用的接口规范。

1.2 环境搭建

1.2.1 virtualenv

推荐安装virtualenv避免污染不同版本的库。PyCharm自带virtualenv,创建Project时可以选择。
安装命令pip install virtualenv
激活命令venv/bin/activate (Linux)或venv\scripts\activate(Windows)

1.2.2 Flask

安装命令pip install Flask

2 代码学习

2.1 构建网站基本功能

2.1.1 启动器介绍

2.1.3 变量规则

可以向规则部分添加参数,动态构建URL。此部分标记为<variable-name> ,支持整数int,浮点数float,带”/”的路径path。

2.1.3 HTTP方法

创建一个login.html。
在Flask下添加对应的处理函数,即可实现数据处理与跳转响应。

2.1.4 返回模板

创建名为hello.html的模板(Template),并增加相关的处理函数。

2.1.5 静态文件

例如html关联js脚本的格式,如下,依次为template文件夹下的index.html,static文件夹下的hello.js,Python路由内容。

2.1.6 表单与模板数据传递

以下分别是表单form.html、输出模板output.html、Python处理函数代码。

2.1.7 Cookies

Cookie以文本形式存在于客户端上。目的是记住与跟踪客户使用相关数据,以此获得更好的访问体验。Flask中处理Cookie如下:

2.1.8 Sessions

Session(会话)数据存在服务器上。一段会话时间是从用户登录到用户注销的时间间隔,期间保存的数据将会存储在服务器临时目录下。每个客户端会分配一个会话ID,会话数据存储在Cookie顶部,服务器对其进行加密签名。对于此加密,Flask需要设置一个secret_key。Session也是一个字典对象,包含所需的键值对。以下为样例:

2.1.9 返回错误代码

Flask错误代码函数为abort(CODE) 。其中code可以为400、401、403、404、406、415、429,分别表示错误请求、未身份验证、Forbidden禁止、未找到、不接受、不支持的媒体类型、请求过。样例代码如下:

2.1.10 flash消息

使用闪现系统向用户反馈信息,Python方法为flash(message, category) ,其中message为所传递的消息,category为消息类型,可以为"error""info""warning"这三种。模板则调用get_flash_messages(with_catagories, with_filter)以此获得并删除消息队列中内容,两个参数均为可选的,第一个表示消息类型,第二个显示特定消息。index.html、login.html模板和Flask方法示例如下:

2.1.11 文件上传

在模板的表单中设置enctype"multipart/form-data" 即可将文件发布到URL。URL处理程序用request.files[]对象中提取文件。其中文件名可以是硬编码也可以从request.files[file]对象的filename中获取,使用secure_filename()可以获取安全版本。Flask也可以设置默认上传文件路径和文件大小,分别使用app.config['UPLOAD_FOLDER']app.config['MAX_CONTENT_LENGTH']设置。upload.html模板和Flask方法样例如下:

2.2 Flask扩展

构建网站需要的更多功能由Flask提供实现,常用的有:Flask-SQLalchemy:操作数据库;Flask-script:插入脚本;Flask-migrate:管理迁移数据库;Flask-Session:Session存储方式指定;Flask-WTF:表单;Flask-Mail:邮件;Flask-Bable:提供国际化和本地化支持,翻译;Flask-Login:认证用户状态;Flask-OpenID:认证;Flask-RESTful:开发REST API的工具;Flask-Bootstrap:集成前端Twitter Bootstrap框架;Flask-Moment:本地化日期和时间;Flask-Admin:简单而可扩展的管理接口的框架。

2.2.1 邮件 Flask-Mail

使用邮件扩展需要先安装flask-mail包,导入为flask_mail。样例代码如下:

2.2.2 表单 Flask-WTF

这一部分的学习内容由于Flask-WTF以及WTForms的更新许多东西与w3c样例有变化,如果需要学习对应版本内容,建议直接从官方网页进行学习,链接如下:

2.2.3 数据库 SQLite 3 & SQLAlchemy

SQLite3是Python内置库,不需要额外添加,这一部分需要额外学习SQLite3库相关用法,建议寻找官方文档学习。在Flask中使用g对象before_request()tardown_request() 分别在请求前和请求后打开关闭数据库连接,使用g.db可以直接获取当前数据库连接。
使用 SQLite 3 - Flask 中文文档 (2.0.2)
在 Flask 中可以方便地按需打开数据库连接,并在情境结束时(通常是请求结束时) 关闭。 下面是一个如何在 Flask 中使用 SQLite 3 的例子: 现在,要使用数据库,应用必须要么有一个活动的应用情境(在存在请求的情况下, 总会有一个),要么创建一个应用情境。在这种情况下, 函数可以用于 获得当前数据库连接。一旦情境灭失,数据库连接就会中断。 注意:如果使用 Flask 0.9 版或者更早版本,需要使用 flask._app_ctx_stack.top 代替 ,因为 对象绑定到请求而不是应用情境。 示例: Note 请牢记,拆卸请求( teardown request )和应用情境( appcontext )函数总 是会执行,即使一个请求前处理器( before-request handler )失败或者没有 执行也是如此。因此,我们在关闭数据库前应当确认数据库已经存在。 在第一次使用时连接的好处是只会在真正需要的时候打开连接。如果需要在一个请求 情境之外使用这个代码,可以在 Python shell 中手动打开应用情境后使用: 现在每个请求处理函数中可以通过 get_db() 来得到当前打开的数据库连接。一个 行工厂( row factory )可以简化 SQLite 的使用,它会在每个结果返回的时候对 返回结果进行加工。例如,为了得到字典型而不是元组型的结果,以下内容可以插入 到前文的 函数中: 这样, sqlite3 模块就会返回方便处理的字典类型的结果了。更进一步,我们可以 把以下内容放到 中: 另外,提供一个函数,用于获得游标、执行查询和获取结果是一个好主意: 这个方便称手的小函数与行工厂联合使用比使用原始的数据库游标和连接对象要方便 多了。 使用该函数示例: 只需要得到单一结果的用法: 如果要给 SQL 语句传递参数,请在语句中使用问号来代替参数,并把参数放在一个 列表中一起传递。不要用字符串格式化的方式直接把参数加入 SQL 语句中,这样会 给应用带来 SQL 注入 的风 险。 关系数据库是需要模式的,因此一个应用常常需要一个 schema.sql 文件来创建数 据库。因此我们需要使用一个函数,用来基于模式创建数据库。下面这个函数可以完 成这个任务: 接下来可以在 Python shell 中创建数据库:
SQLAlchemy是常用的数据抽象层,需要一定的声明才能使用。详情可参考文档:

2.2.4 AJAX请求 sijax

sijax代表“simple ajax”,它是一个python/jquery库。使用方法可以参考如下文档:

2.2.5 UI组件 Boostrap-Flask

区别于Flask-Boostrap,Flask-Boostrap维护不及时,甚至不能使用Boostrap 4。而Boostrap-Flask可以支持Boostrap 5,具体可见文档:

© Kairyu 2022 - 2025