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

PythonAnywhere部署Flask应用调用RESTful接口报504错误求助

问题解决:PythonAnywhere上Flask应用无法自调用API导致504超时

问题根源

PythonAnywhere的Web应用环境存在限制:应用实例无法通过外部域名向自身发起HTTP请求,这类请求会被服务器拦截或长时间等待后返回504超时。同时,你当前通过HTTP调用自身API的做法完全是冗余操作,既增加了请求延迟,又触发了环境限制。

解决方案:直接调用业务逻辑,避免HTTP自调用

不需要通过requests.post调用自身API,直接抽离更新last_seen的公共逻辑,在before_request和API资源中复用即可。

步骤1:抽离公共更新函数

创建一个可复用的函数,把更新用户last_seen的逻辑从API中独立出来,比如在/app/utils.py中:

from datetime import datetime, timezone
from app.models import User
from app import db

def update_user_last_seen(user_id):
    """更新指定用户的last_seen字段"""
    user = User.query.get_or_404(user_id)
    user.last_seen = datetime.now(timezone.utc)
    db.session.commit()

或者直接在User模型中添加方法(更符合MVC模式):

# /app/models.py
from datetime import datetime, timezone
from app import db

class User(db.Model):
    # 现有字段定义...
    last_seen = db.DateTime(timezone=True)

    def update_last_seen(self):
        self.last_seen = datetime.now(timezone.utc)
        db.session.commit()

步骤2:修改API资源,复用公共逻辑

更新/app/api/users.py中的UpdateLastSeen资源,直接调用公共函数:

from app.utils import update_user_last_seen  # 若用模型方法则导入User
from flask_restful import Resource
from app.decorators import token_required  # 你的token装饰器

class UpdateLastSeen(Resource):
    """
    - POST '/api/users/<int:user_id>/update_last_seen'
    """
    @token_required
    def post(self, user_id):
        update_user_last_seen(user_id)
        # 若用模型方法则:
        # user = User.query.get_or_404(user_id)
        # user.update_last_seen()
        return {'message': 'last_seen attribute updated successfully'}, 200

步骤3:修改before_request逻辑,移除HTTP请求

更新/app/auth/routes.py中的update_last_seen函数,直接调用公共逻辑:

from app.utils import update_user_last_seen  # 若用模型方法则导入User
from flask import current_user

@auth_bp.before_request
def update_last_seen():
    if current_user.is_authenticated:
        try:
            update_user_last_seen(current_user.id)
            # 若用模型方法则:
            # current_user.update_last_seen()
        except Exception as e:
            logger.exception(f"Failed to update last_seen for user {current_user.id}: {e}")

额外说明

  • 这种方式不仅解决了PythonAnywhere的环境限制问题,还大幅降低了请求延迟,因为省去了HTTP请求的网络开销和API路由处理步骤。
  • 本地环境能正常运行是因为本地服务器没有这类自请求限制,但即使在本地,直接调用函数也是更优的实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:03:10