快速搭建一个一元二次方程flask应用

新建flask_service目录、templates子目录

flask_service

------ app.py

------ templates

------ ------ index.html

app.py

python 复制代码
from flask import Flask, request, jsonify, render_template
import random
import matplotlib.pyplot as plt
from io import BytesIO
import base64

app = Flask(__name__)

def generate_points(a, b, c, start_x, start_y, end_x, end_y, error_range_x, error_range_y, num_points):
    points = []
    step = 0.1  # 步长,可以根据需要调整
    count = 0

    while count < num_points:
        x = random.uniform(start_x, end_x)
        y_actual = a * x**2 + b * x + c

        # 在实际值附近加入一定的误差
        x_generated = x + random.uniform(-error_range_x, error_range_x)
        y_generated = y_actual + random.uniform(-error_range_y, error_range_y)

        # 确保生成的点在范围内
        if start_x <= x_generated <= end_x and start_y <= y_generated <= end_y:
            points.append((x_generated, y_generated))
            count += 1

    return points

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        a = float(request.form['a'])
        b = float(request.form['b'])
        c = float(request.form['c'])
        start_x = float(request.form['start_x'])
        start_y = float(request.form['start_y'])
        end_x = float(request.form['end_x'])
        end_y = float(request.form['end_y'])
        error_range_x = float(request.form['error_range_x'])
        error_range_y = float(request.form['error_range_y'])
        num_points = int(request.form['num_points'])

        points = generate_points(a, b, c, start_x, start_y, end_x, end_y, error_range_x, error_range_y, num_points)

        x_values = [point[0] for point in points]
        y_values = [point[1] for point in points]

        plt.figure(figsize=(8, 6))
        plt.scatter(x_values, y_values, color='blue')
        plt.xlabel('X')
        plt.ylabel('Y')
        plt.title('Scatter Plot of Generated Points')
        plt.axhline(0, color='black', linewidth=0.5)
        plt.axvline(0, color='black', linewidth=0.5)
        plt.grid(True)
        plt.legend()

        # Convert plot to base64 string
        img_data = BytesIO()
        plt.savefig(img_data, format='png')
        img_data.seek(0)
        img_base64 = base64.b64encode(img_data.getvalue()).decode()
        plt.close()

        # 准备要传递给模板的数据
        info = {
            'img_base64': img_base64,
            'points': points,
	    'a': a,
            'b': b,
            'c': c,
            'start_x': start_x,
            'start_y': start_y,
            'end_x': end_x,
            'end_y': end_y,
            'error_range_x': error_range_x,
            'error_range_y': error_range_y,
            'num_points': num_points
        }
		# 按照 x 轴从小到大排序
    	points.sort(key=lambda point: point[0])
        return render_template('index.html', info=info, points=points)

    return render_template('index.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

index.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Generate Points</title>
    <style>
        .container {
            display: flex;
            flex-direction: row;
            align-items: flex-start;
            justify-content: space-between;
        }
        .form-container {
            width: 50%;
            margin-right: 20px;
        }
        .image-container {
            width: 50%; /* 调整图形容器宽度 */
            margin: 0 auto; /* 居中显示图形容器 */
        }        
        img {
            max-width: 100%;
            height: auto;
        }
    </style>
</head>
<body>
    <h1>Generate Points</h1>
    <div class="container">
        <div class="form-container">
            <form method="POST">
                <label for="a">二次项系数 a:</label>
                <input type="text" id="a" name="a" value="0"><br><br>

                <label for="b">一次项系数 b:</label>
                <input type="text" id="b" name="b" value="-2"><br><br>

                <label for="c">常数项系数 c:</label>
                <input type="text" id="c" name="c" value="1"><br><br>

                <label for="start_x">起始 x:</label>
                <input type="text" id="start_x" name="start_x" value="-5"><br><br>

                <label for="start_y">起始 y:</label>
                <input type="text" id="start_y" name="start_y" value="-5"><br><br>

                <label for="end_x">结束 x:</label>
                <input type="text" id="end_x" name="end_x" value="5"><br><br>

                <label for="end_y">结束 y:</label>
                <input type="text" id="end_y" name="end_y" value="5"><br><br>

                <label for="error_range_x">x轴方向的误差范围:</label>
                <input type="text" id="error_range_x" name="error_range_x" step="0.1" value="0.2"><br><br>

                <label for="error_range_y">y轴方向的误差范围:</label>
                <input type="text" id="error_range_y" name="error_range_y" step="0.1" value="0.5"><br><br>

                <label for="num_points">生成的点的个数:</label>
                <input type="text" id="num_points" name="num_points" value="50"><br><br>

                <input type="submit" value="生成图形">
            </form>
            {% if info %}
            <h2>图片信息:</h2>
            <p>二次项系数 a: {{ info['a'] }}</p>
            <p>一次项系数 b: {{ info['b'] }}</p>
            <p>常数项系数 c: {{ info['c'] }}</p>
            <p>起始 x: {{ info['start_x'] }}</p>
            <p>起始 y: {{ info['start_y'] }}</p>
            <p>结束 x: {{ info['end_x'] }}</p>
            <p>结束 y: {{ info['end_y'] }}</p>
            <p>x轴方向的误差范围: {{ info['error_range_x'] }}</p>
            <p>y轴方向的误差范围: {{ info['error_range_y'] }}</p>
            <p>生成的点的个数: {{ info['num_points'] }}</p>
            <h2>点的坐标:</h2>
            <ul>
                {% for point in points %}
                <li>{{ point[0] }}, {{ point[1] }}</li>
                {% endfor %}
            </ul>
            {% endif %}
        </div>
        <div class="image-container">
            {% if info %}
            <img src="data:image/png;base64,{{ info['img_base64'] }}" alt="Generated Plot">
            {% endif %}
        </div>
    </div>
</body>
</html>

nohup 后台启动

bash 复制代码
[root@hecs-334217 flask_service]# nohup python3 app.py  > app.log 2>&1 &
[3] 7178

页面效果

点击生成图形

相关推荐
小han的日常几秒前
pycharm分支提交操作
python·pycharm
程序猿麦小七11 分钟前
基于springboot的景区网页设计与实现
java·spring boot·后端·旅游·景区
蓝田~19 分钟前
SpringBoot-自定义注解,拦截器
java·spring boot·后端
明月清风徐徐19 分钟前
Scrapy爬取豆瓣电影Top250排行榜
python·selenium·scrapy
theLuckyLong20 分钟前
SpringBoot后端解决跨域问题
spring boot·后端·python
.生产的驴21 分钟前
SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性
java·spring boot·后端·spring·spring cloud·gateway·rabbitmq
Yongqiang Cheng23 分钟前
Python operator.itemgetter(item) and operator.itemgetter(*items)
python·operator·itemgetter
小扳25 分钟前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
MavenTalk26 分钟前
Move开发语言在区块链的开发与应用
开发语言·python·rust·区块链·solidity·move
v'sir35 分钟前
POI word转pdf乱码问题处理
java·spring boot·后端·pdf·word