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

Flask脚本返回HTML模板后如何继续执行后续代码

问题分析与解决方案

核心问题

在Flask视图函数中,return语句的作用是向客户端返回HTTP响应,一旦执行该语句,函数会立即终止,后续代码自然不会再运行。你想在拿到final2后就返回模板,但又要执行后续爬取逻辑,这本身存在逻辑冲突——HTTP请求是同步响应模式,一个请求对应一次响应,无法先返回响应再继续执行代码(除非用异步方案)。

解决方案

根据你的实际需求,分三种场景处理:

场景1:后续爬取仅为后台任务,无需返回前端

如果后面的网页爬取、链接处理只是后台执行的逻辑,不需要把结果传给前端,直接把return放到所有代码最后,先执行完所有逻辑再返回模板:

from flask import Flask, render_template, request
from bs4 import BeautifulSoup
import requests
import re
import urllib.parse  # 导入标准库用于URL编码

app = Flask(__name__)

@app.route("/")
def index():
    return render_template("index.html")

@app.route("/validate-user", methods=["POST"])
def validate_user():
    if request.method == "POST":
        name = request.form['userid']
        # 用标准库简化URL空格编码,替代手动循环逻辑
        urlfix = urllib.parse.quote(name)
        MOurl = "https://dreate.monster/movies/search/?q=" + urlfix

        source = requests.get(MOurl).text

        soup1 = BeautifulSoup(source, "lxml")
        article1 = soup1.find('div', class_='image__placeholder')
        final2 = article1.find('img').get("data-src")
        print(final2)

        # 执行后续爬取与链接处理逻辑
        soup = BeautifulSoup(source, "lxml")
        article = soup.find('div', class_='mv-item-infor')
        final = article.find('a').get("href")

        final1 = "https://dreate.monster" + final

        page = requests.get(final1)
        bSoup = BeautifulSoup(page.content, 'html.parser')
        links_list = bSoup.find('a', class_="round-button")
        final_link = links_list['href']

        old_url = final_link
        url = re.sub("sid=", "sid=2b5lj4nffh3lm9rfd4o2p7vv1j", old_url)
        
        # 所有逻辑执行完成后,再返回模板
        return render_template("index.html", variable1=final2)

场景2:后续爬取结果也需要传给前端展示

如果后面处理得到的url也需要在页面中展示,先把所有变量准备好,最后统一传给模板:

@app.route("/validate-user", methods=["POST"])
def validate_user():
    if request.method == "POST":
        name = request.form['userid']
        urlfix = urllib.parse.quote(name)
        MOurl = "https://dreate.monster/movies/search/?q=" + urlfix

        source = requests.get(MOurl).text

        soup1 = BeautifulSoup(source, "lxml")
        article1 = soup1.find('div', class_='image__placeholder')
        final2 = article1.find('img').get("data-src")
        print(final2)

        # 执行后续逻辑并保存结果
        soup = BeautifulSoup(source, "lxml")
        article = soup.find('div', class_='mv-item-infor')
        final = article.find('a').get("href")

        final1 = "https://dreate.monster" + final

        page = requests.get(final1)
        bSoup = BeautifulSoup(page.content, 'html.parser')
        links_list = bSoup.find('a', class_="round-button")
        final_link = links_list['href']

        old_url = final_link
        processed_url = re.sub("sid=", "sid=2b5lj4nffh3lm9rfd4o2p7vv1j", old_url)
        
        # 将多个变量一起传入模板
        return render_template("index.html", variable1=final2, movie_link=processed_url)

之后在index.html中可以用{{ movie_link }}调用该变量。

场景3:后续逻辑耗时较长,不想让用户等待加载

如果爬取和处理过程耗时久,用户会一直处于等待状态,此时需要用异步任务:

  1. 先返回带有final2的模板,让用户快速看到内容
  2. 将后续爬取逻辑放到异步任务队列(如Celery + Redis)中后台执行
  3. 若需展示后台处理结果,可通过WebSocket或前端轮询的方式更新页面

这种方式需要额外配置异步任务环境,适合处理耗时操作。

额外优化建议

  • 增加异常捕获,避免网络错误或页面结构变化导致脚本崩溃:
try:
    source = requests.get(MOurl, timeout=10).text
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
    return render_template("index.html", error="网络请求失败,请稍后重试")

article1 = soup1.find('div', class_='image__placeholder')
if not article1:
    return render_template("index.html", error="未找到对应电影信息")
final2 = article1.find('img').get("data-src")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:48:26