Flask 系列 - 消息闪现

消息闪现

Flask 提供了消息闪现的功能,以使我们的应用可以向用户反馈信息。比如,当用户登录失败了,我们会提醒用户名错误或者密码错误。

在 Flask 中使用消息闪现很简单。下面我们以上一篇的例子进行说明。完整的代码在这里

首先,让我们看一下book.py的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# -*- coding: utf-8 -*-
from flask import Blueprint, url_for, render_template, request, flash, redirect
book_bp = Blueprint(
'book',
__name__,
template_folder='../templates',
)
books = ['The Name of the Rose', 'The Historian', 'Rebecca']
@book_bp.route('/', methods=['GET'])
def index():
return '<h1>Hello World!</h1>'
@book_bp.route('/book', methods=['GET', 'POST'])
def handle_book():
_form = request.form
if request.method == 'POST':
title = _form["title"]
books.append(title)
flash("add book successfully!") # 使用 flash 反馈消息
return redirect(url_for('book.handle_book'))
return render_template(
'book.html',
books=books
)

阅读全文 »

Flask 系列 - 蓝图

蓝图

在开始学 Flask 的时候,我们习惯把代码写在单一的文件里面,虽然看起来很方便,但也只是供学习的时候用用而已,真正在一个实际项目中,是不应该这样做的,为什么呢?

我们还是从 hello world 开始讲起,新建一个脚本文件,比如 hello.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cat hello.py
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello World!"
if __name__ == "__main__":
app.run(host='127.0.0.1', port=5200, debug=True)

运行该脚本,在浏览器输入链接 http://localhost:5200/,可以看到 Hello World! 的字样。

阅读全文 »

Flask 系列 - 请求、重定向及会话

请求、重定向及会话

Web 开发中经常需要处理 HTTP 请求、重定向和会话等诸多事务,相应地,Flask 也内建了一些常见的对象如 request, session, redirect 等对它们进行处理。

请求对象 request

HTTP 请求方法有 GET、POST、PUT 等,request 对象也相应地提供了支持。举个例子,假设现在我们开发一个功能:用户注册。如果 HTTP 请求方法是 POST,我们就注册该用户,如果是 GET 请求,我们就显示注册的字样。代码示例如下(注意,下面代码并不能直接运行,文末提供了完整的代码):

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, request
app = Flask(__name__)
@app.route('/register', methods=['POST', 'GET']):
def register():
if request.method == 'GET':
return 'please register!'
elif request.method == 'POST':
user = request.form['user']
return 'hello', user

阅读全文 »

Flask 系列 - 路由和视图

路由和视图

我们在前面的一小节介绍了一个简单的 Flask 程序是怎么运行的。其中,有三行代码,我们并没有深入讲解。在这里,我们就对它们进行深入解析。回顾这三行代码:

1
2
3
@app.route("/")
def hello():
return "Hello World!"

这三行代码的意思就是:如果浏览器要访问服务器程序的根地址(”/“),那么 Flask 程序实例就会执行函数 hello() ,返回『Hello World!』。

也就是说,上面三行代码定义了一个 URL 到 Python 函数的映射关系,我们将处理这种映射关系的程序称为『路由』,而 hello() 就是视图函数。

阅读全文 »

Flask 系列 - Flask 快速入门

Flask 简介

Python 中有许多 Web 开发框架,比如 DjangoFlaskTornadoBottleweb.py 等,其中,Django 可以说是一个全能型(all in one)的框架,自带管理后台;而 Flask 则是一个非常轻量级的框架,提供了搭建 Web 服务的必要组件,如果你不喜欢自带的组件,由于 Flask 良好的扩展性,你也可以使用其他开源的 Flask 扩展插件,甚至可以自己写一个,让喜欢折腾的开发者一展身手;Tornado 则主打异步处理,高并发,这也是它的一个显著特点。

第一次接触到 Flask 时被它的简洁感动了,几行代码就可以快速搭建出一个简单的 Web 服务,于是就义无反顾地踏上了 Flask 的学习之路,慢慢地就学习到了诸如 Jinja2 模板引擎,路由,视图和静态文件等。Flask 非常小,源码文件包括注释在内,总共才 6000 多行,当你能熟练使用 Flask 的各个模块时,相信你也可以读懂它的所有源码。

阅读全文 »

Flask 系列 - 基于 Flask 提供 RESTful Web 服务

什么是 REST

REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转移』,估计读者看到这个词也是云里雾里的,我当初也是!这里,我们先不纠结这个词到底是什么意思。事实上,REST 是一种 Web 架构风格,它有六条准则,满足下面六条准则的 Web 架构可以说是 Restuful 的。

  1. 客户端-服务器(Client-Server)

    服务器和客户端之间有明确的界限。一方面,服务器端不再关注用户界面和用户状态。另一方面,客户端不再关注数据的存储问题。这样,服务器端跟客户端可以独立开发,只要它们共同遵守约定。

  2. 无状态(Stateless)

    来自客户端的每个请求必须包含服务器所需要的所有信息,也就是说,服务器端不存储来自客户端的某个请求的信息,这些信息应由客户端负责维护。

  3. 可缓存(Cachable)

    服务器的返回内容可以在通信链的某处被缓存,以减少交互次数,提高网络效率。

  4. 分层系统(Layered System)

    允许在服务器和客户端之间通过引入中间层(比如代理,网关等)代替服务器对客户端的请求进行回应,而且这些对客户端来说不需要特别支持。

  5. 统一接口(Uniform Interface)

    客户端和服务器之间通过统一的接口(比如 GET, POST, PUT, DELETE 等)相互通信。

  6. 支持按需代码(Code-On-Demand,可选)

    服务器可以提供一些代码(比如 Javascript)并在客户端中执行,以扩展客户端的某些功能。

阅读全文 »

在 Python 中使用 Base64 编码和解码

Base64 简介

Base64,简单地讲,就是用 64 个字符来表示二进制数据的方法,这 64 个字符包含小写字母 a-z、大写字母 A-Z、数字 0-9 以及符号”+”、”/“,其实还有一个 “=” 作为后缀用途,所以实际上有 65 个字符。

关于如何进行 Base64 编码转换的步骤可参考此文。本文主要介绍如何使用 Python 进行 Base64 编码。事实上,Python 已经内置了一个用于 Base64 编解码的库:base64。编码使用 base64.b64encode() 方法,解码使用 base64.b64decode() 方法。

对文本进行 Base64 编解码

1
2
3
4
5
6
7
8
9
10
>>> import base64
>>> str = 'hello world'
>>>
>>> base64_str = base64.b64encode(str)
>>> print base64_str
aGVsbG8gd29ybGQ=
>>>
>>> ori_str = base64.b64decode(base64_str)
>>> print ori_str
hello world

阅读全文 »

快速搭建一个简单的 http 服务

搭建一个简单的 http 服务

利用 python 的 SimpleHTTPServer,我们可以使用下面的命令快速搭建一个简单的 http 服务:

1
2
3
4
5
6
# 如果不填 port 的话,默认端口是 8000
$ python -m SimpleHTTPServer <port>
Serving HTTP on 0.0.0.0 port 8000 ...
# python3 的用法
$ python3 -m http.server <port>

在本机访问 http://localhost:8000,会列出该目录下的所有文件。假如该目录只有 index.html,则会显示 index.html 这个文件。

可以看到,上面的 HTTP 服务器服务的是网络中的所有主机(0.0.0.0),如果你只想让它在本地有效,可能你会这么尝试 python -m SimpleHTTPServer 127.0.0.1:9000,但这是不支持的。我们可以这么做:

阅读全文 »