Flask部署Web服务学习笔记

MirrorYuChen
MirrorYuChen
发布于 2024-12-10 / 17 阅读
0
0

Flask部署Web服务学习笔记

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/:将不同功能模块的路由分开管理。
    ​\qquad main.py:主模块的路由。
    ​\qquad auth.py:认证相关的路由。
  • app/models/:管理数据模型,通常与数据库操作相关。
    ​\qquad user.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

参考资料


评论