【Flask 3.1.2】3 访问 API 并直接返回结果

一、无校验

直接提供API,接受用户传来的请求,根据请求执行自己的签名,直接返回用户结果。

服务端代码

from flask import Flask, request, jsonify
import hashlib

app = Flask(__name__)


@app.route("/bili", methods=["POST"])
def bili():
    """
    请求的数据格式要求:{"ordered_string": "..."}
    """

    ordered_string = request.json.get("ordered_string")
    if not ordered_string:
        return jsonify({'status': False, 'error': "参数错误"})

    # 核心算法 生成sign签名
    encrypt_string = ordered_string + "dasdsadsdasdsadsadsadsad"
    obj = hashlib.md5(encrypt_string.encode('utf-8'))
    sign = obj.hexdigest()
    return jsonify({'status': True, 'data': sign})


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=5000)

(模拟)请求端代码

import requests

# 目标URL
url = "http://127.0.0.1:5000/bili"

# 要发送的请求体数据(字典形式)
data = {
    "ordered_string": "dnsaonv039h09g095h1nnoc0wjv91ncmosad01-e95ghwe9nfc0mq"
}

# 发送POST请求
response = requests.post(url, json=data)

# 处理响应
print("状态码:", response.status_code)  # 200表示成功
print("响应内容:", response.text)        # 响应的文本内容

# 如果响应是JSON格式,可以直接解析
if response.status_code == 200:
    try:
        json_data = response.json()
        print("JSON响应:", json_data)
    except ValueError:
        print("响应不是JSON格式")

image

二、有校验-基于文件授权

生成uuid

用于待会进行校验

import uuid

print(uuid.uuid4())

得到一个uuid:4aba0848-f42d-424b-8c4d-457c7a70b852
写入到db.txt
所有记录在db.txt的用户为合法用户

image

请求端

import requests

# 目标URL
url = "http://127.0.0.1:5000/bili?token=14b4a328-volj-9j4b-b89d-45782a70b137"

# 要发送的请求体数据(字典形式)
data = {
    "ordered_string": "dnsaonv039h09g095h1nnoc0wjv91ncmosad01-e95ghwe9nfc0mq"
}

# 发送POST请求
response = requests.post(url, json=data)

# 处理响应
print("状态码:", response.status_code)  # 200表示成功
print("响应内容:", response.text)        # 响应的文本内容

# 如果响应是JSON格式,可以直接解析
if response.status_code == 200:
    try:
        json_data = response.json()
        print("JSON响应:", json_data)
    except ValueError:
        print("响应不是JSON格式")

image

服务端

from flask import Flask, request, jsonify
import hashlib

app = Flask(__name__)


# 一个简单的校验
def get_user_dict():
    info_dict = {}
    with open("db.txt", mode='r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            token, name = line.split(',')
            info_dict[token] = name
    print(info_dict)
    return info_dict


@app.route("/bili", methods=["POST"])
def bili():
    """
    请求的url中需要携带token /bili?token=4aba0848-f42d-424b-8c4d-457c7a70b852
    请求的数据格式要求:{"ordered_string": "..."}
    """
    # 没有附带token
    token = request.args.get("token")
    if not token:
        return jsonify({'status': False, 'error': "认证失败"})

    # 不是合法token
    user_dict = get_user_dict()
    if token not in user_dict:
        return jsonify({'status': False, 'error': "认证失败"})

    ordered_string = request.json.get("ordered_string")
    if not ordered_string:
        return jsonify({'status': False, 'error': "参数错误"})

    # 核心算法 生成sign签名
    encrypt_string = ordered_string + "dasdsadsdasdsadsadsadsad"
    obj = hashlib.md5(encrypt_string.encode('utf-8'))
    sign = obj.hexdigest()
    return jsonify({'status': True, 'data': sign})


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=5000)

image

三、有校验-基于数据库授权(PostgreSQL)

数据库

在 PostgreSQL 中新建一个表 user
image

手动插入2条数据,记得保存
image

服务端

from flask import Flask, request, jsonify
import hashlib
import psycopg2

app = Flask(__name__)


@app.route("/bili", methods=["POST"])
def bili():
    """
    请求的url中需要携带token /bili?token=4aba0848-f42d-424b-8c4d-457c7a70b852
    请求的数据格式要求:{"ordered_string": "..."}
    """
    # 1. token是否为空 连接PostgreSQL
    token = request.args.get("token")
    print(token)
    if not token:
        return jsonify({'status': False, 'error': "认证失败"})

    # 2. token是否合法
    # 连接Postgre
    conn = psycopg2.connect(
            database="postgres",
            user="postgres",
            password="123",
            host="127.0.0.1",
            port="5432"
        )
    cursor = conn.cursor()

    cursor.execute("select * from user_token_name where token=%s", [token, ])
    result = cursor.fetchone()
    cursor.close()
    conn.close()

    if not result:
        return jsonify({'status': False, 'error': "认证失败"})

    ordered_string = request.json.get("ordered_string")
    if not ordered_string:
        return jsonify({'status': False, 'error': "参数错误"})

    # 核心算法 生成sign签名
    encrypt_string = ordered_string + "dasdsadsdasdsadsadsadsad"
    obj = hashlib.md5(encrypt_string.encode('utf-8'))
    sign = obj.hexdigest()
    return jsonify({'status': True, 'data': sign})


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=5000)

image

请求端

代码和上文相同
image

服务端优化:集成数据库连接池

原本的代码每次都要新建和撤销连接,效率低。
需要安装DBUtils包

from flask import Flask, request, jsonify
import hashlib
import psycopg2
from dbutils.pooled_db import PooledDB

app = Flask(__name__)

POOL = PooledDB(
    # 连接池配置
    creator=psycopg2,   # 用来连接数据库的模块
    maxconnections=10,  # 连接池最大允许的连接数 0和None表示不限制连接数
    mincached=2,        # 初始化时,连接池中最少创建的空闲连接,0表示不创建
    maxcached=3,        # 连接池中最多闲置的的连接,0和None不限制
    blocking=True,      # 连接池中如果没有可用连接,是否阻塞等待
    setsession=[],      # 开始会话前执行的命令列表 如:["set datestyle to ...", "..."]
    ping=0,

    # 数据库配置
    host="127.0.0.1",
    port="5432",
    user="postgres",
    password="123",
    database="postgres"
)


@app.route("/bili", methods=["POST"])
def bili():
    """
    请求的url中需要携带token /bili?token=4aba0848-f42d-424b-8c4d-457c7a70b852
    请求的数据格式要求:{"ordered_string": "..."}
    """
    # 1. token是否为空 连接PostgreSQL
    token = request.args.get("token")
    print(token)
    if not token:
        return jsonify({'status': False, 'error': "认证失败"})

    # 2. token是否合法
    # 连接Postgre
    conn = POOL.connection()    # 通过连接池获取连接
    cursor = conn.cursor()

    cursor.execute("select * from user_token_name where token=%s", [token, ])
    result = cursor.fetchone()
    cursor.close()
    conn.close()                # 将此连接交还连接池

    if not result:
        return jsonify({'status': False, 'error': "认证失败"})

    ordered_string = request.json.get("ordered_string")
    if not ordered_string:
        return jsonify({'status': False, 'error': "参数错误"})

    # 核心算法 生成sign签名
    encrypt_string = ordered_string + "dasdsadsdasdsadsadsadsad"
    obj = hashlib.md5(encrypt_string.encode('utf-8'))
    sign = obj.hexdigest()
    return jsonify({'status': True, 'data': sign})


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=5000)

参考资料

[1] 【最快速度搞定Flask-框架教程】06~10

posted @ 2025-08-22 08:59  苦涩如影相随固  阅读(24)  评论(0)    收藏  举报