当前位置:   article > 正文

初尝python flask + vue3 axios 接口配置_vue调用python接口

vue调用python接口

首先使用pycharm创建python flask 项目,

在项目的app.py文件下,

  1. //Python flask app.py
  2. from flask import Flask, request, jsonify
  3. app = Flask(__name__)
  4. # 处理GET请求
  5. @app.route('/api/data', methods=['GET'])
  6. def get_data():
  7. # 处理GET请求的逻辑
  8. data = {'name': 'yangMing', 'age': 24}
  9. return jsonify(data)
  10. # 处理POST请求
  11. @app.route('/api/data', methods=['POST'])
  12. def post_data():
  13. # 获取POST请求的数据
  14. data = request.json
  15. # 处理POST请求的逻辑
  16. # ...
  17. # 返回响应
  18. response_data = {'message': 'Data post successfully'}
  19. return jsonify(response_data)
  20. if __name__ == '__main__':
  21. app.run(host='127.0.0.1', port=5000)
  22. //host表示该地址只在本机调用,调用端口号5000来运行该服务器项目

之后,开启flask,服务器在端口5000运行

配置vue,引入axios、

这个地方其实可以使用相对路径的方法去获取数据。如果使用绝对路径,会产生axios的跨域问题,我们首先在vite.config.js里配置路径

跨域的调试和修改方法也可以参考之前的关于axios GET/POST 跨域及传参问题

  1. //vite.config.js
  2. import { fileURLToPath, URL } from 'node:url'
  3. import { defineConfig } from 'vite'
  4. import dns from 'dns'
  5. import vue from '@vitejs/plugin-vue'
  6. dns.setDefaultResultOrder('verbatim')
  7. // https://vitejs.dev/config/
  8. export default defineConfig({
  9. plugins: [vue()],
  10. resolve: {
  11. alias: {
  12. '@': fileURLToPath(new URL('./src', import.meta.url))
  13. }
  14. },
  15. server:{
  16. proxy:{
  17. "/api":{
  18. target:"http://127.0.0.1:5000/api/data", //目标路径
  19. changeOrigin:true,
  20. rewrite: (path) => path.replace(/^\/api/, ''),
  21. }
  22. }
  23. }
  24. })

main.js

  1. //main.js
  2. import { createApp } from 'vue'
  3. import App from './App.vue'
  4. const app = createApp(App)
  5. app.mount('#app')

之后返回App.vue,渲染页面

  1. <script setup>
  2. import axios from "axios";
  3. const getEvent = function () {
  4. axios
  5. .get("/api")
  6. .then((res) => {
  7. console.log(res);
  8. })
  9. .catch(function (error) {
  10. console.log(error);
  11. });
  12. };
  13. let param = new URLSearchParams();
  14. param.append("name", "yangMing");
  15. param.append("age", 24);
  16. const postEvent = function () {
  17. axios
  18. .post("/api", JSON.stringify(param), {
  19. headers: {
  20. "Content-Type": "application/json",
  21. },
  22. })
  23. .then((res) => {
  24. console.log(res);
  25. })
  26. .catch(function (error) {
  27. console.log(error);
  28. });
  29. };
  30. </script>
  31. <template>
  32. <button @click="getEvent">get</button>
  33. <button @click="postEvent">post</button>
  34. </template>
  35. <style scoped></style>

这里注意代码中的axios.post方法,相比较之前文章的方法。此处,我们虽然设置了传参param,但是如果直接提交,

 如果缺少请求头,则会报错 415

如果只存在请求头而不JSON解析数据后传参,则会报错400

因此,综上所述,在后端服务器python不写任何解析代码和简化HTTP请求代码的情况下,此处必须使用JSON传参,并必须携带请求头!

如果此处不使用JSON.stringify进行解析,则服务端flask就需要解析。前端和服务端如果都不解析,则会报错。Vue的axios包自带JSON解析功能,但仅限于获取数据,因此发送数据时,还是需要解析后发送的。

  1. headers: {
  2. "Content-Type": "application/json",
  3. },

请求表头。

调试,

 运行完成。

===============================解决BUG=================================

 这里后台收不到post的参数传值,和之前遇到的情况一样。

百度看了一下,修改vue里定义param的代码,让let param = new FormData();

调试,后台接收参数正常。

  1. let param = new FormData(); 这里的定义出现了差异
  2. param.append("name", "yangMing");
  3. param.append("ageee", "24");
  4. const postEvent = function () {
  5. axios
  6. .post("/api", param, {
  7. headers: {
  8. "Content-Type": "application/json",
  9. },
  10. })
  11. .then((res) => {
  12. console.log(res);
  13. })
  14. .catch(function (error) {
  15. console.log(error);
  16. });
  17. };

后台python接收参数正常。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50021
推荐阅读
相关标签
  

闽ICP备14008679号