Flask部署Web服务学习笔记
1.Flask安装
# 1.安装Flask
>> pip install Flask
# 2.查看Flask信息
>> pip show Flask
Name: flask
Version: 3.0.3
Summary: A simple framework for building complex web applications.
Home-page: None
Author: None
Author-email: None
License: None
Location: /home/mirror/.local/lib/python3.8/site-packages
Requires: importlib-metadata, click, itsdangerous, blinker, Werkzeug, Jinja2
Required-by:
2.Flask示例
2.1 创建示例
创建 app.py
文件,并添加以下内容:
from flask import Flask
# 1.创建一个Flask应用实例
app = Flask(__name__)
# 2.使用Flask装饰器,告知Flask不同URL应该触发的函数
@app.route('/')
def hello_world():
return 'Hello, World!'
# 3.代码入口
if __name__ == '__main__':
# 4.启动Flask内置的开发服务器,debug=True会启动调试模式
app.run(debug=True)
2.2 运行示例
(1) 运行 python
例程
>> python app.py
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 278-361-921
(2) 浏览器打开上面提示网址 http://127.0.0.1:5000
,就可以看到 Hello, World!
字样,到此示例运行结束。
3.Flask基本概念
3.1 路由
路由是由URL到Python函数的映射,这样当URL被访问时,就会调用对应函数,例如:
from flask import Flask
app = Flask(__name__)
# 将URL '/'映射到home函数
@app.route('/')
def home():
return 'Welcome to the home page!'
# 将URL '/about'映射到about函数
@app.about('/about')
def about():
return 'this is the about page'
3.2 视图函数
视图函数是处理请求并返回响应的Python函数,它们通常接收请求对象作为参数,并返回响应对象,或直接返回字符串、HYML等内容。
from flask import Flask
@app.route('/greet/<name>')
def greet(name):
return f'Hello, {name}'
3.3 请求对象
请求对象包含了客户端发送的请求信息,如,请求方法、URL、请求头、表单数据等。Flask提供了request对象来访问这些信息:
from flask import Flask, request
app = Flask(__name__)
# 设置请求方法为POST
@app.route('/submit', methods=['POST'])
def submit():
# PostMan的Body信息,获取表单数据的'username'字段
username = request.form.get('username')
# PostMan的Params信息,获取参数数据的'username'字段
# username = request.args.get('usrname')
return f'Hello, {username}'
if __name__ == '__main__':
app.run(debug=True)
3.4 响应对象
响应对象包含了发送给客户端的响应信息,包括状态码、响应头和响应体。Flask默认会将字符串、HTML直接作为响应体。
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/custom_response')
def custom_response():
# 1.创建一个自定义对象
response = make_response('This is a custom response')
# 2.设置响应头
response.headers['X-custom-Header'] = 'Value'
return response
if __name__ == '__main__':
app.run(debug=True)
3.5 模板
Flask使用Jinja2模板引擎来渲染HTML模板,模板允许你将Python代码嵌入到HTML中,从而动态生成网页内容:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/hello/<name>')
def hello(name):
return render_template('hello.html', name=name)
if __name__ == '__main__':
app.run(debug=True)
创建文件夹 templates
并在文件夹下创建 hello.html
文件,文件内容为:
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello, {{ name }}</h1>
</body>
</html>
3.6 应用工厂
应用工厂是一个Python函数,用于创建和配置Flask应用实例,这种方法允许你创建多个应用实例,或在不同配置下初始化应用。
from flask import Flask
# 创建一个Flask应用实例,并从配置对象中加载配置
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config_name)
from . import routes
app.register_blueprint(routes.bp)
return app
3.7 配置对象
配置对象用于设置应用的各种配置选项,如,数据库连接字符串、调试模式等,可以通过直接或加载配置文件来配置Flask应用。
class Config:
DEBUG = True
SECRET_KEY = 'mysecretkey'
SQLALCHEMY_DATABASE_URI = 'sqlite:///mydatabase.db'
app.config.from_object(Config)
:将Config类中配置选项加载到应用配置中。
3.8 蓝图(Blueprints)
蓝图是Flask中组织代码的方式,它允许你将相关的视图函数、模板和静态文件组织在一起,并可以在多个应用中重用。
from flask import Blueprint
bp = Blueprint('main', __name__)
@bp.route('/')
def home():
return 'Home Page'
注册蓝图 app/__init__.py
from flask import Flask
from .routes import bp as main_bp
def create_app():
app = Flask(__name__)
app.register_blueprint(main_bp)
return app
3.9 静态文件(Static Files)
静态文件是不会被服务器执行的文件,如,CSS,JavaScripts和图片文件。Flask提供了一个简单方法来服务这些文件:
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
静态文件目录:将静态文件放在static文件夹中,Flask会自动提供服务。
3.10 扩展(Extensions)
Flask有许多扩展,可以添加额外的功能,如数据库集成、表单验证、用户认证等,这些扩展提供了更高级的功能和第三方集成。
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
db = SQLAlchemy(app)
SQLAlchemy
用于数据库集成的扩展。
3.11 会话(Sessions)
Flask使用客户端会话来存储用户信息,以便用户浏览应用时记住他们的状态,会话数据存储在刻划断cookie中,并在服务端进行签名和加密。
from flask import session
# 自动生成的密钥
app.secret_key = 'your_secret_key_here'
@app.route('/set_session/<username>')
def set_session(username):
session['username'] = username
return f'Session set for {username}'
@app.route('/get_session')
def get_session():
username = session.get('username')
return f'Hello, {username}!' if username else 'No session data'
session对象用于存取会话数据,你可以使用Python内置的secrets模块生成一个强随机性的密钥:
python -c 'import secrets; print(secrets.token_hex())'
3.12 错误处理(Error Handling)
Flask允许你定义错误处理函数,当特定错误发生时,这些函数会被调用,也可以自定义错误页面或处理逻辑。
@app.errorhandler(404)
def page_not_found(e):
return 'Page not found', 404
@app.errorhandler(500)
def internal_server_error(e):
return 'Internal server error', 500
4.项目结构
4.1 简单项目结构
my_flask_app/
│
├── app.py
└── requirements.txt
app.py
:主要的 Flask 应用文件,包含路由和视图函数的定义。requirements.txt
:列出项目的依赖库,用于记录 Flask 和其他包的版本信息。
4.2 中型项目结构
my_flask_app/
│
├── app/
│ ├── __init__.py
│ ├── routes.py
│ └── models.py
│
├── config.py
├── requirements.txt
└── run.py
app/
:包含 Flask 应用的主要代码。
\qquad __init__.py
:初始化 Flask 应用和配置扩展。
\qquadroutes.py
:定义应用的路由和视图函数。
\qquadmodels.py
:定义应用的数据模型。
config.py
:配置文件,包含应用的配置信息。requirements.txt
:列出项目的依赖库。run.py
:用于启动 Flask 应用。
4.3 复杂项目
my_flask_app/
│
├── app/
│ ├── __init__.py
│ ├── routes/
│ │ ├── __init__.py
│ │ ├── main.py
│ │ └── auth.py
│ ├── models/
│ │ ├── __init__.py
│ │ └── user.py
│ ├── templates/
│ │ ├── layout.html
│ │ └── home.html
│ └── static/
│ ├── css/
│ └── js/
│
├── config.py
├── requirements.txt
├── migrations/
│ └── ...
└── run.py
app/routes/
:将不同功能模块的路由分开管理。
\qquadmain.py
:主模块的路由。
\qquadauth.py
:认证相关的路由。app/models/
:管理数据模型,通常与数据库操作相关。
\qquaduser.py
:用户模型。app/templates/
:存放 HTML 模板文件。app/static/
:存放静态文件,如 CSS 和 JavaScript。migrations/
:数据库迁移文件,通常与 SQLAlchemy 相关。
5.Flask部署
5.1 部署方式
Flask 应用通常需要一个 WSGI 服务器来处理 Python 应用程序和 HTTP 请求,通常与一个 Web 服务器(如 Nginx 或 Apache)配合使用。常见的 WSGI 服务器有:
- Gunicorn:一个流行的 WSGI 服务器,适用于 UNIX 系统。
- uWSGI:支持多种协议的高性能 WSGI 服务器,适用于 UNIX 和 Windows 系统。
- Waitress:一个简单且高效的 WSGI 服务器,适用于 Windows 系统。
5.2 使用Gunicorn部署
5.2.1 安装Gunicorn
>> pip install gunicorn
5.2.2 运行Flask应用
>> gunicorn -w 4 -b 0.0.0.0:8000 app:app
-w 4
:启动 4 个工作进程。-b 0.0.0.0:8000
:绑定到所有网络接口上的 8000 端口。app:app
:指定 Flask 应用实例的位置,格式为模块名:实例名
。
5.2.3 配置Nginx反向代理
Nginx 通常用作反向代理,将请求转发到 Gunicorn,以下是一个 Nginx 配置示例,/etc/nginx/sites-available/yourapp 文件内容:
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用nginx配置
sudo ln -s /etc/nginx/sites-available/yourapp /etc/nginx/sites-enabled
sudo systemctl restart nginx
5.3 使用uWSGI部署
5.3.1 安装uWSGI
>> pip install uwsgi
5.3.2 创建uWSGI配置文件
- uwsgi.ini文件内容:
[uwsgi]
module = app:app
master = true
processes = 4
socket = 127.0.0.1:8000
chmod-socket = 660
vacuum = true
die-on-term = true
5.3.3 运行uWSGI
>> uwsgi --ini uwsgi.ini
5.3.4 配置Nginx反向代理
Nginx 配置与 Gunicorn 部署时类似,只需将 proxy_pass 地址更新为 http://127.0.0.1:8000
参考资料
- [1] Flask 部署