基于 宝塔Linux + vue3 + pythonFlask + mysql 完整项目方案运行总结

一定要先用空白页面调试前后端接口环境!

一定要先用空白页面调试前后端接口环境!

一定要先用空白页面调试前后端接口环境!

重要的写在前面、因为我是在学习过程中徐徐渐进地部署的环境。本来是打算只vue的,结果想上传到云服务器让大家都看到,于是开始学搭建 阿里云 服务器;然后因为有点Linux的底子,就搭建的Linux的操作系统的环境;虽然是大多情况用的宝塔面板进行的项目上传,但是所有的Bug飘红,加起来也真够喝一壶了。

本文主要用来记录所有开发环境下的报错异常。供他人参考。具体的代码不做过多解释。



Vue

因为我一开始使用的是从 vite.config.js中配置路径,就像这样

 server:{

    proxy:{
      "/regist":{
        target:"http://127.0.0.1:5000/regist",
        changeOrigin:true,
        rewrite: (path) => path.replace(/^\/regist/, ''),
      },
      "/checkLogin":{
        target:"http://127.0.0.1:5000/checkLogin",
        changeOrigin:true,
        rewrite: (path) => path.replace(/^\/checkLogin/, ''),
      },
    }
  },

之后在前端页面这样调用:

const checkLogin = function () {
  let params = new URLSearchParams();
  params.append("userName", userAccount);
  params.append("userPass", userPass);
  axios
    .post("/checkLogin", params, {
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
      },
    })
    .then((res) => {
      if (res.data.state == 0) {
        ElMessage({
          message: res.data.message,
          type: "success",
        });
        router.push({ path: "/indexContent" });
      } else {
        ElMessage({
          message: res.data.message,
          type: "warning",
        });
      }
    })
    .catch(function (error) {
      ElMessage({
        message: "发生未知错误,编码:" + error + ",请联系管理员",
        type: "warning",
      });
    });
};

看似没有问题,并且在本地服务器上正常运行。但是一上传到服务器,他就跑到localHost/checkLogin寻找路径去了,完全无视了127.0.0.1:5000,特别是无视掉了这个端口号!找不到具体的端口号自然就没法发送HTTP请求啊,所以报错也是理所当然....

解决方案:使用绝对路径。就不要在 vite.config.js 中定义了,直接将axios中的' /checkLogin' 改为http://##你的域名##:5000/checkLogin。这个地方可能在本地服务器会出现跨域的问题,虽然在谷歌浏览器的组件中下载Proxy SwitchyOmega可以短暂解决本地调试的问题。但是实际上传到云服务器还是会出现跨域的问题。

前端vue设置的跨域解决方案:调试的过程其实安装谷歌的组件就可以了。但是如果上传到服务器,前端在请求头中可以声明  'Access-Control-Allow-Origin': '*' ;这样就可以了。因为主要的跨域配置大多需要在服务器端通过CORS解决。所以前端的代码中不太需要呈现过多的跨域解决方案。

其实前端的最最最主要的问题就是正确找到服务器端的接口,并正确提供数据的问题。搞清楚你发送的POST的请求是JSON数据还是表单数据,搞清楚你的请求头到底是"Content-Type": "application/x-www-form-urlencoded" 还是 application/json ,之后问明白你的服务器端的开发人员,有没有设置其他的匹配选项。设置跨域声明 'Access-Control-Allow-Origin': '*' 。剩下的就是开发好交互页面就可以了。



Python

宝塔面板配置Python的运行环境是比较令人头疼的。

首先,确保你的运行端口。我一开始没有意识到这个问题,于是在python的代码最后一个片段,声明了运行端口:

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

看似没有什么问题。本地调试也可以正常运行,并且端口号5000一点问题也没有。但是一旦上传到服务器,立马报错,前后端的接口找不到!

解决方案:此代码片段可以解释为,我后台Python的程序跑在本地5000的端口上。结果我Vue中访问的是 域名:5000 这个端口号,自然得不到想要的结果。这个部分其实可以将127.0.0.1修改为自己服务器的域名,也可以修改为0.0.0.0 , 后者在大型服务器中不建议使用,但是在平常的小规模开发中,还是绰绰有余的。


关于python宝塔面板的搭建,

先将python打包上传到云服务器,然后添加python项目

 大概就是这么设置。

这个地方提交完后,python是没法正常运行的。原因就是你代码中的片段,导入的第三方库,他并不能自动下载安装、导入。

通过模块功能下载所需要的第三方库,此处我导入了

import flask 
import flask_cors
import mysql-connector-python

 安装完后运行,便可以正常运行了。如果出现问题,可以点击设置,进入日志查看原因


 Mysql

先从本地导出.sql文件,之后添加数据库,确保数据库名和服务端请求的数据库名相同(或者和本地的调试数据库名相同),之后导入数据库.sql文件,即可。

 


其实调试的过程中,bug飘红的次数远比目前写下的多。但是等项目调试完成后,总结出来也就那么大体几个问题。

前后端接口的调用。跨域问题是一个大问题。

云服务器需要开放相应接口安全组,或者防火墙。

之所以建议使用空白页面调试前后端接口开发环境,是因为在项目的后期,如果出现问题,有些时候报404和500错误,没法辨别是前端axios出了问题,还是后端提供的接口出了问题。

但是在以后的具体项目开发中,一定要标注好使用localhost或者127.0.0.1域名端口的位置。在后期上传到云服务器的过程中,都要更改为相应的域名端口,以便他人访问、

先写到这,后期想到什么代表性BUG再加...