Flask 框架

发布时间: 更新时间: 总字数:528 阅读时间:2m 作者: IP上海 分享 网址

Flask 框架介绍

介绍

安装

pip install flask
  • main.py
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    app.logger.info("Hello World!")
    return 'Hello World!'


# if __name__ == '__main__':
#     app.run()
# app.run(host="unix:///tmp/app.sock")
# FLASK_APP=app.py flask run --host=unix:///tmp/app.sock
  • 使用 gunicorn 运行
$ gunicorn main:app
[8267] [INFO] Starting gunicorn 19.10.0
[8267] [INFO] Listening at: http://127.0.0.1:8000 (8267)
[8267] [INFO] Using worker: sync
[8272] [INFO] Booting worker with pid: 8272

# gunicorn -w 4 package:app --bind unix:/tmp/app.sock
  • 访问
$ curl http://127.0.0.1:8000
Hello World!

其他

  • uWSGI
  • Werkzeug 实现 WSGI
  • Jinja 模板语言
  • Click 一个用于编写命令行应用程序的框架
  • greenlet 当应用程序中使用 gevent 或 eventlet
  • pyeve/eve 为人类设计的 REST API 框架
  • Flasgger 是一个 Flask 扩展,可以从你的 API 中注册的所有 Flask 视图中提取 OpenAPI-Specification
  • pallets/flask 用于构建网络应用程序的 Python 微型框架
  • Flask 扩展汇总

dmeo

flask + sqlite3 数据库操作示例

expand-id ...
from flask import Flask, request, jsonify
import sqlite3
import random
import string
from datetime import datetime

app = Flask(__name__)
DATABASE = 'data.db'

# 初始化数据库
def init_db():
    conn = sqlite3.connect(DATABASE)
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS entries
                 (id INTEGER PRIMARY KEY AUTOINCREMENT,
                  content TEXT,
                  created_at DATETIME)''')
    conn.commit()
    conn.close()

# 生成随机字符串
def generate_random_string(length=12):
    letters = string.ascii_letters + string.digits
    return ''.join(random.choice(letters) for _ in range(length))

# 写接口
@app.route('/write', methods=['POST'])
def write_entry():
    # 生成随机内容
    random_content = generate_random_string()

    # 获取当前时间
    now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    # 写入数据库
    try:
        conn = sqlite3.connect(DATABASE)
        c = conn.cursor()
        c.execute("INSERT INTO entries (content, created_at) VALUES (?, ?)",
                 (random_content, now))
        conn.commit()
        conn.close()
        return jsonify({
            "status": "success",
            "message": "Data written successfully",
            "data": {
                "content": random_content,
                "created_at": now
            }
        }), 201
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500

# 读接口
@app.route('/read', methods=['GET'])
def read_entries():
    try:
        conn = sqlite3.connect(DATABASE)
        c = conn.cursor()
        c.execute("SELECT * FROM entries ORDER BY id DESC")
        entries = c.fetchall()
        conn.close()

        # 格式化结果
        results = []
        for entry in entries:
            results.append({
                "id": entry[0],
                "content": entry[1],
                "created_at": entry[2]
            })

        return jsonify({
            "status": "success",
            "count": len(results),
            "data": results
        }), 200
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500

if __name__ == '__main__':
    init_db()
    app.run(debug=True)

F&Q

RuntimeError: Working outside of application context

// app = Flask(__name__)
with app.app_context():
    ...

使用 uwsgi 发布 request.files 为空

request.files 返回值为 ImmutableMultiDict([])

解决方式:

  • 通过 nginx 代理(测试可用)
  • form 表单配置 enctype="multipart/form-data"
  • 配置 MAX_CONTENT_LENGTH
app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024  # 10MB
  • uwsgi.ini 配置
[uwsgi]
...
http = :8000
http-timeout = 120
http-keepalive = true
http-auto-chunked = true
http-write-timeout = 120
http-sendfile = true
http-chunked-request = true
post-buffering = 8192
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数