Flask 是一种轻量级的 Python Web 框架,它的设计目标是将项目的复杂度保持在最低,同时提供必要的工具和插件以完成 Web 项目开发。
Flask 的主要特点如下:
- **微框架**:Flask 提供了基础的 Web 项目功能,例如路由管理和请求处理,但并没有包括数据库抽象层、表单验证等复杂功能。这意味着 Flask 很轻量,而且非常适合新手上手学习。
- **灵活和可扩展**:尽管 Flask 的核心功能非常有限,但它可以通过扩展(extensions)来提供更丰富的功能,如用户认证、表单验证、对象关系映射(ORM)等。你可以根据项目需求选择使用这些扩展。
- **RESTful 请求分发**:Flask 内建的 URL 路由系统支持 RESTful 风格的 URL,使得你的 Web 服务可以很好地适应现代 Web 应用。
- **Jinja2模板**:Flask 默认的模板引擎是 Jinja2,它提供了丰富的功能来动态生成 HTML。
- **Werkzeug WSGI 工具箱**:Flask 使用 Werkzeug 作为它的 WSGI 工具箱和服务器,这个工具箱包含了 HTTP 协议的很多实用功能。
## Flask 是内置了Web Server 吗
是的,Flask是一种微型的Web框架,它内置了一个基于Werkzeug的开发Web服务器。在Flask应用程序中,你可以通过调用app.run()方法来启动这个内置的Web服务器。
下面是一个启动内置Web服务器的Flask应用程序的示例:
python
Copy code
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
请注意,尽管Flask内置的Web服务器用于开发和测试是非常方便的,但在生产环境中不建议使用。原因是,这个服务器只是一个简单的、单线程的服务器,没法处理大量的并发请求。在生产环境中,你通常会使用像Gunicorn或uWSGI这样的WSGI服务器,可能还会配合一个反向代理,例如Nginx。
## Werkzeug 是内置服务器吗
Werkzeug不是一个完整的web服务器,而是一个WSGI (Web Server Gateway Interface)的工具包或者Utility Library。它提供了一些用于HTTP和WSGI处理的函数和类,可以帮助开发人员构建他们自己的框架或服务器。
然而,Werkzeug确实提供了一个简单的开发服务器,可以运行WSGI应用,但这通常仅在开发环境中使用。这个开发服务器是Flask用来创建其内置web服务器的基础。
这里有一段简单的通过Werkzeug创建一个WSGI application的Python代码:
python
Copy code
from werkzeug.wrappers import Request, Response
def application(environ, start_response):
request = Request(environ)
text = 'Hello, %s!' % request.args.get('name', 'World')
response = Response(text, mimetype='text/plain')
return response(environ, start_response)
if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, application)
在这个例子中,run_simple函数启动了Werkzeug提供的开发服务器,'application'函数则是我们自定义的WSGI应用程序。
同样地,虽然你可以用Werkzeug的这个开发服务器来运行你的WSGI应用,但是在生产环境中,你一般需要使用像Gunicorn或uWSGI这样的WSGI服务器,可能还会加上像Nginx这样的反向代理。Werkzeug的开发服务器并不适合处理大量并发请求。
## Werkzeug
Werkzeug 是一个 Python 的 WSGI(Web Server Gateway Interface)工具库,理解为一种 Web 应用程序库或简单的Web框架也是可以的。它不仅实现了全面的 WSGI 规范,还提供了许多方便开发人员创建 Web 服务的功能和底层工具。其中就包括请求和响应对象,URL 路由,模板引擎挂钩,以及一个强大的交互式调试系统。
一些主要的 Python Web 框架,像 Flask,都建立在 Werkzeug 之上。
以下是一段简单的使用 Werkzeug 库的代码:
python
Copy code
from werkzeug.wrappers import Request, Response
def application(environ, start_response):
request = Request(environ)
text = 'Hello, %s!' % request.args.get('name', 'World')
response = Response(text, mimetype='text/plain')
return response(environ, start_response)
if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, application)
这段代码中,application 函数就是一个基础的 WSGI 应用。通过 Werkzeug 提供的 Request 类可以方便地解析请求参数。同时 Response 类提供一个方便的方式来创建 WSGI 响应。run_simple 函数则可以启动一个简单的 WSGI HTTP 服务器。
Werkzeug 库的主要优势在于其灵活性和模块化设计,这使你能够选择你需要的部分并自行组合,创建出适合你需求的 Web 应用。
## Werkzeug vs 内置Tomcat 服务器
虽然Werkzeug和内置的Tomcat在某些方面有相似性(它们都可以作为开发服务器做开发测试),但是它们之间还是存在显著的差异:
语言:Werkzeug是用Python编写的,通常用于Python web开发,支持WSGI标准。而Tomcat是用Java编写的,用于运行Java Servlet和JSP页面。
功能:Tomcat是一个完整的Web服务器和Servlet容器,不仅可以用作开发测试,还含有许多生产环境所需的功能,如安全管理、负载均衡等。而Werkzeug主要是Python的WSGI工具库,含有一个开发服务器,主要用于开发和调试,不建议在生产环境中使用。
标准:Werkzeug被设计为遵循WSGI(Web Server Gateway Interface)标准,Python的一种Web服务标准。而Tomcat遵循的是Java的Servlet和JSP规范。
所以,可以说,Werkzeug的目标是为Python Web开发者提供一个轻量级的解决方案,而Tomcat更多地面向企业级Java Web应用的开发和部署。
下面的表格可以更直观地对比这两者:
Werkzeug Tomcat
语言 Python Java
规范 遵循WSGI标准 遵循Servlet/JSP规范
功能 WSGI工具库,含有开发服务器 完整的Web服务器和Servlet容器
使用场景 主要用于开发和调试 用于开发测试,也包含许多生产环境所需的功能
## WSGI
WSGI,全称为Web Server Gateway Interface,是Python应用程序或框架和Web服务器之间的一种接口标准。它定义了如何让web服务器和Python应用程序进行通信。
在WSGI模型中,Web服务器只需知道如何将请求传递给WSGI应用,并知道如何将应用的响应发送回客户端。而WSGI应用的实现则可能会极其复杂,包括路由、模板渲染、处理表单数据、与数据库交互等,并且这些实现对于Web服务器来说是透明的。
下面是一个最简单的WSGI应用的示例:
python
Copy code
def simple_app(environ, start_response):
"""Simplest possible application object"""
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return ['Hello world!\n']
# The if __name__ == '__main__': check ensures this code is only run if
# the file is started as a standalone server, not if the module is imported
if __name__ == '__main__':
# Installing the WSGI application as the default application for
# the Python WSGI server 'wsgiref'.
from wsgiref.simple_server import make_server
srv = make_server('localhost', 8080, simple_app)
srv.serve_forever()
在这个示例中,simple_app就是一个WSGI应用。它接受两个参数:environ是一个环境变量的字典,包含了CGI style的环境变量;start_response是一个回调函数,用于设定HTTP响应的状态和头部。这个WSGI应用返回的是一个字节串的列表,对于Web服务器来说,这些字节串就是响应的主体。
然而在实际开发中,手动创建WSGI应用非常枯燥且低效,因此一般我们使用Web框架如Flask或Django,这些框架都包装了WSGI应用,并提供了方便的工具和API,使我们能专注于编写业务逻辑,而无需过多关心WSGI的细节。
## Flask 基本语法
Flask 框架的基础语法非常简单。下面是一些主要语法和概念:
1. 导入 Flask 模块:
```python
from flask import Flask
```
2. 创建 Flask Web 服务器实例:
```python
app = Flask(__name__)
```
这里,`__name__` 是一个特殊的内置 Python 变量,它代表当前模块的名字。
3. 定义一个路由:
```python
@app.route('/')
```
这里, `'/'` 是 URL 的路径。这个装饰器告诉 Flask,当用户访问 `'/'`(即首页)时,应该执行下面的函数。
4. 定义一个视图函数:
```python
def hello():
return "Hello, World!"
```
这个函数被称为“视图函数”,它返回的字符串将作为 HTTP 响应发送给客户端。
5. 启动 Flask 内置的 Web 服务器:
```python
if __name__ == "__main__":
app.run()
```
这段代码告诉 Python,如果你运行这个脚本(而不是从其他脚本导入它),则启动 Web 服务器。
这个完整的 Flask 应用程序如下:
```python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!"
if __name__ == "__main__":
app.run()
```
这就是 Flask 的基本语法。然后你可以添加更多的路由和视图函数,或者使用 Flask 的其他功能(如模板、会话管理、错误处理等)来扩展你的应用。
## Flask 进阶开发
当你已经熟悉了 Flask 的基础用法后,可以开始进入更加高级的 Flask 开发。以下是一些你可能会用到的主题和技术:
1. **大型 Flask 应用架构**
在大型 Flask 应用中,你可能需要模块化你的代码以保持其可管理性。这通常涉及到使用 Flask 的 “蓝图” (Blueprints),可以让你在多个模块中组织你的路由和视图函数。
2. **数据库处理**
Flask 不包括数据库访问能力,但通过 Flask-SQLAlchemy 扩展提供了 ORM (对象-关系映射) 功能。学习如何定义模型、进行数据库迁移,以及使用 SQLAlchemy 的查询接口,都是高级 Flask 开发的关键。
3. **用户身份验证和授权**
如何处理用户登录、权限检查、账户管理等往往在 Flask 开发中非常重要。Flask-Login 和 Flask-Security 扩展都是很好的工具。
4. **表单处理**
Flask-WTF 和 WTForms 提供了创建和验证 Web 表单的功能。
5. **RESTful API**
如果你打算使用 Flask 创建一个 RESTful API,那么 Flask-RESTful 扩展是一个很好的开始。
6. **测试**
学习如何使用 Python 的 unittest 模块针对你的 Flask 应用编写单元测试。
7. **部署**
Flask 应用可以使用多种方式进行部署,包括传统的 WSGI 服务器,如 Gunicorn 或 uWSGI,也包括更现代的方式,例如 Docker 容器和云服务平台。
8. **性能优化**
学习如何使用缓存、数据库优化、HTTP 压缩等技术来提升你 Flask 应用的性能。
## 示例
以下是一个最简单的 Flask 应用程序例子:
```python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello, World!"
if __name__ == '__main__':
app.run(debug=True)
```
在这个例子中,`@app.route('/')` 是 Flask 的路由装饰器,定义了当用户访问网站的根 (`/`) 路径时,应该调用哪个函数(在本例中是 `home` 函数)。这个函数返回的字符串将作为 HTTP 响应发送给客户端。
注意这个文件命名 不能是 flask.py, 可以是app.py 等
- 前言
- 1.入门篇
- Python介绍
- 安装与使用
- Python开发利器之VS Code
- 模块安装
- 命令行
- 一次Python无法安装模块的问题探索与解决之旅
- 命令运行
- Conda
- 下载地址
- 2.基础篇
- 基础语法
- 输入与输出
- with as的用法
- 注释
- Python命令行参数
- 编码
- 变量类型
- 列表遍历
- 运算符
- 表达式语句
- 条件
- 循环
- 日期和时间
- 函数
- 高级语法
- @符号-装饰器
- 模块和包
- name
- init.py
- 错误和异常
- 面向对象
- 3.专题篇
- 常用功能
- Python 字符串连接
- python web
- Python CGI编程
- Python OAuth2
- 认证 Flask-HTTPAuth
- 常用命令
- 内置函数
- dir()
- print(f)
- 标准模块
- sys
- pickle-数据序列化
- os
- IO(输入输出)
- 键盘输入
- 文件读写
- 测试
- Python测试框架之pytest快速入门
- pytest-bdd快速示例和问题解决
- 基于pytest-bdd的项目目录结构和命名规范
- python BDD 的相关概念
- Behave介绍和快速示例
- Python BDD之Behave测试报告
- Python BDD 框架比较之 pytest-bdd vs behave
- pytest进阶
- Flask + pytest测试
- 参考网址
- pytest-bdd进阶
- hehave进阶
- 测试路径
- python + selunium
- HTML 根据多层CSS 查找元素
- 等待执行
- 使用text 查找 span
- pytest如何在控制台输出
- 4.问题篇
- pip pip3 及区别
- TypeError: can only concatenate str (not "NoneType") to str
- 5.实战篇
- matplotlib-绘图包
- 导入类
- 命名规范
- 模块查找
- 6.进阶篇
- Flask
- Flask介绍
- Flask扩展模块
- Flask-Login
- 问题
- Jinja2
- Flask-RESTful
- Flask-JWT-Extended
- WSGI
- Flask-SQLAlchemy
- 部署
- Flask VS Django
- Flask Web
- Flask + Vue
- Flask实战
- Flask 标准目录结构
- Blueprints
- 参考
- FastAPI 测试
- https 证书 Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate