python如何在服务器上运行并传输图片给网页

大家好,我是一名初中生,自己写了一个python成绩可视化的程序,大概功能是读取成绩单然后保存统计图到电脑文件中,现在想把他放在服务器上,实现一个老 师传输成绩单给网页,网页处理后生成文件支持学生查询,已经学习了HTML和CSS的前端内容(对服务器0基础),Python文件已经打包成一个exe文件,想用最简便的方式快速搭建起服务器,已经做好了一个网站https://ask.csdn.net/cjfx.qinhao2008.top(现在是用OSS存储的文件)
功能:1.传输文件到服务器,exe文件运行并生成图片
2.用户根据姓名和考号查询自己成绩,并展示图片
希望大家能指出我那一方面该学习那些内容(尽可能少的,快捷的),具体到学习那一方面,那一模块,谢谢

你所需要学习的内容主要包括:

  1. 服务器基础知识:了解服务器的概念、各种常见服务器软件的功能和特点等。建议先学习一些基础的网络协议,如HTTP,TCP/IP等。

  2. Web开发技术:掌握Web前端技术(HTML、CSS、JavaScript),后端编程语言(Python、PHP、Java等)。建议学习Python Web框架,如Flask、Django等。

  3. 文件传输和存储:掌握文件传输和存储的相关知识,如FTP、SFTP等协议,云存储服务等。

对于你的具体需求,可以按照以下步骤实现:

  1. 搭建一个Web服务器,如Apache、Nginx等。可以使用云服务器,如阿里云、腾讯云等。

  2. 学习Python Web框架,如Flask、Django等,并编写Web应用程序。在应用程序中,实现传输文件到服务器并运行exe文件生成图片的功能。

  3. 将生成的图片保存在云存储服务中(如OSS),并将对应的URL存储在数据库中。

  4. 编写查询页面,并实现从数据库中获取对应的URL,并展示对应的成绩统计图。

  5. 根据用户输入的姓名和考号,在数据库中查询对应的成绩信息,并将对应的URL展示在页面上。

bs的python网站是不需要把Python文件打包成exe文件的,建议你使用django框架来实现,需要也不多,进阶些的话可以加个数据库

根据你的需要,建议学习下Python Web框架:Flask或者Django都可以。HTML网页基本的你都会的话,那就需要学习下进行前后台怎交互,学习下ajax请求。因为web框架有它自己的一套写法和实现逻辑,所以要先搞懂它的逻辑,然后实现功能即可。其它的应该你都会了。

引用chatGPT作答,首先,您需要一个服务器来托管您的应用程序并提供对其的访问。您可以使用云计算平台(例如AWS、Azure、Google Cloud)或虚拟私有服务器(VPS)提供商(例如Digital Ocean、Linode、Vultr)来设置服务器。您需要熟悉Linux系统的基本命令和一些网络配置知识来管理服务器。

一旦您有了服务器,您可以使用Python的Web框架(例如Flask、Django)来编写Web应用程序。您可以使用Flask轻松地编写Web应用程序,使用Flask-WTF进行表单处理,并使用Flask-Uploads处理文件上传。

为了实现您的功能,您需要编写两个视图函数:一个用于处理文件上传和成绩统计图的生成,另一个用于查询学生的成绩并显示成绩统计图。

您需要将您的Python程序部署在服务器上,并配置Web服务器(例如Nginx、Apache)来代理到您的应用程序。最后,您需要使用HTML、CSS和JavaScript编写一个网页来展示您的应用程序,并与您的应用程序进行交互,以便用户可以查询他们的成绩并查看成绩统计图。

总体来说,这是一个相对复杂的任务,需要涵盖多个方面的知识和技能。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    回答:

    首先,针对问题中提到的需求,我们可以将Python的成绩可视化程序保存到服务器上,并且在服务器上运行,生成图片后再将图片传输给网页。而用户查询成绩的功能需要涉及到网页开发,可以使用前端框架如Vue.js来实现。根据问题中提供的参考资料,为了实现这些功能,需要掌握如下模块:

    模块:random、subprocess、string、os、shutil。

    针对具体的问题,给出以下解决方案:

    1. 将文件传输到服务器并运行EXE文件以生成图片。

    首先,需要将Python的成绩可视化程序保存到服务器上,在服务器上运行,生成图片并保存到指定目录中。具体步骤如下:

    (1)将Python的成绩可视化程序打包为一个.exe文件,上传到服务器。

    (2)在服务器上安装Python环境和所需的Python库,例如:matplotlib等。

    (3)使用subprocess模块运行exe文件,并指定成绩单文件路径和图片保存路径。

    代码示例:

    import subprocess
    
    def run_visualization_program(exe_path, score_path, image_path):
        # 运行可视化程序
        cmdline = "{exe_path} {score_path} {image_path}"
        ret = subprocess.call(cmdline.format(exe_path=exe_path, score_path=score_path, image_path=image_path), shell=True)
        if ret == 0:
            print("可视化程序执行成功!")
        else:
            print("可视化程序执行失败!")
    

    这里的exe_path是可视化程序的路径,score_path是成绩单文件的路径,image_path是图片保存的路径,通过调用subprocess模块执行可视化程序,并将参数传递给它。

    1. 用户根据姓名和考号查询自己的成绩,并展示图片。

    针对这个需求,需要在网页上搭建前端环境和后端环境。前端环境需要使用HTML、CSS、JavaScript等技术,后端环境需要使用Python和Flask等技术。具体步骤如下:

    (1)前端框架:可以使用Vue.js等前端框架,搭建前端环境。需要使用HTML、CSS、JavaScript等技术,实现前端页面的设计和交互。

    (2)后端框架:可以使用Flask等后端框架,搭建后端环境。需要使用Python编写后端程序,实现查询成绩和返回结果的功能。

    (3)数据库:需要使用SQLite或MySQL等数据库,存储学生的成绩信息。可以使用SQLAlchemy等Python库来进行数据库连接和操作。

    代码示例:

    (1)HTML页面设计,可以使用Vue.js等前端框架来实现。

    <template>
      <div>
        <p>请输入姓名和考号:</p>
        <input v-model="name">
        <input v-model="id">
        <button @click="queryScore">查询成绩</button>
        <img v-bind:src="imagePath">
      </div>
    </template>
    
    <script>
      import axios from 'axios'
    
      export default {
        data() {
          return {
            name: '',
            id: '',
            imagePath: ''
          }
        },
    
        methods: {
          queryScore() {
            // 发送POST请求到后端,查询成绩并返回图片路径
            let postData = {
              name: this.name,
              id: this.id
            }
            axios.post('/query', postData)
              .then(response => {
                this.imagePath = response.data.image_path
              })
              .catch(error => {
                console.log(error)
              })
          }
        }
      }
    </script>
    

    (2)Python后端程序编写,使用Flask框架来实现。

    import os
    from flask import Flask, request, jsonify
    from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, select
    from werkzeug.utils import secure_filename
    
    app = Flask(__name__)
    
    # 数据库连接和表定义
    engine = create_engine('sqlite:///scores.db', echo=True)
    metadata = MetaData()
    scores = Table('scores', metadata,
        Column('id', Integer, primary_key=True),
        Column('name', String),
        Column('id_num', String),
        Column('score', String),
        Column('image_path', String),
    )
    metadata.create_all(engine)
    
    # 允许上传的文件类型
    ALLOWED_EXTENSIONS = {'csv'}
    
    def allowed_file(filename):
        # 判断上传的文件类型是否允许
        return '.' in filename and \
               filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
    
    @app.route('/upload', methods=['POST'])
    def upload_file():
        # 上传文件到指定目录中
        file = request.files['file']
        if file and allowed_file(file.filename):
            # 文件名安全处理
            filename = secure_filename(file.filename)
            # 保存路径
            save_path = os.path.join(app.root_path, 'uploads')
            if not os.path.exists(save_path):
                os.makedirs(save_path)
            file_path = os.path.join(save_path, filename)
            # 保存文件
            file.save(file_path)
            # 更新数据库
            conn = engine.connect()
            conn.execute(scores.insert(), [
                {'name': '张三', 'id_num': '123456', 'score': '90', 'image_path': ''},
                {'name': '李四', 'id_num': '234567', 'score': '85', 'image_path': ''},
            ])
            conn.close()
            return jsonify({'status': 'success'})
        else:
            return jsonify({'status': 'error', 'message': '文件格式不正确!'})
    
    @app.route('/query', methods=['POST'])
    def query_scores():
        # 查询成绩并返回图片路径
        name = request.json['name']
        id_num = request.json['id']
        conn = engine.connect()
        query = select([scores]).where((scores.c.name == name) & (scores.c.id_num == id_num))
        result = conn.execute(query)
        row = result.fetchone()
        result.close()
        conn.close()
        if row is None:
            # 没有查询到结果
            return jsonify({'status': 'error', 'message': '没有查询到结果!'})
        else:
            # 已经有图片的直接返回路径
            if row.image_path != '':
                return jsonify({'status': 'success', 'image_path': row.image_path})
            else:
                # 重新生成图片
                score = row.score
                score_path = '/path/to/score/file'
                # 将score和生成图片的Python程序传递给服务器,生成图片并返回路径
                subprocess.call(['python', 'visualize.py', score_path])
                # 更新数据库
                conn = engine.connect()
                query = scores.update().where((scores.c.name == name) & (scores.c.id_num == id_num)).values(image_path=image_path)
                conn.execute(query)
                conn.close()
                return jsonify({'status': 'success', 'image_path': image_path})
    

    这段代码中,我们定义了Flask的/上传和/query路由,/上传路由处理文件上传的请求,当该路由被请求时,处理流程是:检查文件格式,保存文件到指定目录,更新数据库。

    /query路由处理成绩查询的请求,当该路由被请求时,查询指定姓名和考号的成绩,如果已经有生成的图片,则直接返回图片路径;如果没有生成图片,则传递成绩和生成图片的Python程序给服务器,生成图片后返回图片路径,同时更新数据库。

    综上所述,我们可以通过以上的解决方案,实现将Python成绩可视化程序放在服务器上,并实现上传成绩单、查询成绩的功能。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^