You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

首次学习Flask:React前端对接Flask API遇错误求助

问题分析与解决方案

核心错误原因

你遇到的两个错误都是Flask后端视图函数的问题:

  1. TypeError: total_visitors() takes 0 positional arguments but 2 were given:视图函数定义的参数数量与Flask路由传递的参数不匹配,或者视图函数错误返回了另一个需要参数的函数。
  2. The view function did not return a valid response... but it was a function:视图函数最终返回的不是Flask认可的响应类型(如字符串、字典、Response对象),而是返回了一个函数。

第一步:修正Flask后端代码

正确的访问计数器API实现

from flask import Flask, jsonify
from flask_cors import CORS  # 解决跨域问题,需要先安装:pip install flask-cors

app = Flask(__name__)
CORS(app)  # 开发环境允许所有跨域请求,生产环境可指定具体域名

# 全局变量存访问量(生产环境建议改用Redis/数据库持久化)
total_visitors = 0

@app.route('/api/visitors', methods=['GET'])
def get_visitors():
    global total_visitors
    total_visitors += 1  # 每次前端请求时递增计数
    return jsonify({"count": total_visitors})

关键修正点

  • 视图函数get_visitors无额外参数(路由无变量时不需要),避免参数不匹配错误。
  • 直接返回jsonify生成的响应对象,而非函数,符合Flask响应要求。
  • 添加flask-cors解决React与Flask跨域请求问题。

第二步:修正Redux的counterSlice代码

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';

// 异步请求后端API获取并更新访问量
export const fetchVisitorCount = createAsyncThunk(
  'counter/fetchVisitorCount',
  async () => {
    const res = await fetch('http://localhost:5000/api/visitors');
    const data = await res.json();
    return data.count;
  }
);

const counterSlice = createSlice({
  name: 'counter',
  initialState: {
    count: 0,
    status: 'idle',
    error: null
  },
  reducers: {},
  extraReducers: (builder) => {
    builder
      .addCase(fetchVisitorCount.pending, (state) => {
        state.status = 'loading';
      })
      .addCase(fetchVisitorCount.fulfilled, (state, action) => {
        state.status = 'succeeded';
        state.count = action.payload;
      })
      .addCase(fetchVisitorCount.rejected, (state, action) => {
        state.status = 'failed';
        state.error = action.error.message;
      });
  }
});

export default counterSlice.reducer;

第三步:修正React Home组件

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchVisitorCount } from './counterSlice';

const Home = () => {
  const dispatch = useDispatch();
  const { count, status, error } = useSelector(state => state.counter);

  // 组件挂载时请求后端更新并获取访问量
  useEffect(() => {
    dispatch(fetchVisitorCount());
  }, [dispatch]);

  return (
    <div className="home-container">
      <h1>我的作品集</h1>
      {status === 'loading' && <p>加载访问量中...</p>}
      {status === 'failed' && <p>加载失败: {error}</p>}
      {status === 'succeeded' && <p>总访问次数: {count}</p>}
    </div>
  );
};

export default Home;

验证步骤

  1. 启动Flask服务:python app.py
  2. 启动React项目:npm start
  3. 访问React页面,即可看到访问量自动递增并展示。

内容的提问来源于stack exchange,提问作者Jeffrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:33:25