Flask如何向非templates目录的index.html传递数据并渲染
实现方法
你可以根据需求选择Flask适配方案或者无框架静态方案,都不需要把index.html移动到templates文件夹。
方案一:保留Flask框架
方法1:修改Flask默认模板路径
Flask初始化时支持自定义模板查找目录,直接将模板目录指向项目根目录即可,原有Jinja2模板的变量写法完全不需要改动。
修改main.py的Flask初始化部分:
from flask import Flask, render_template # template_folder='.' 即指定当前项目根目录为模板查找路径 app = Flask(__name__, template_folder='.') from bs4 import BeautifulSoup import requests # 原有爬虫逻辑无需改动 url = "https://example.com" req = requests.get(url) bs0bj = BeautifulSoup(req.text, "html.parser") data = bs0bj.find_all('div', {"class": "exampleClass"})[0].text.strip() @app.route('/') def home(): # 直接读取根目录下的index.html完成渲染 return render_template('index.html', data=data) if __name__ == '__main__': app.run()
方法2:手动读取文件替换内容
如果不想依赖Flask的模板渲染机制,可以直接手动读取根目录的index.html,替换占位符后返回响应,完全绕开模板规则:
from flask import Flask import html app = Flask(__name__) from bs4 import BeautifulSoup import requests # 原有爬虫逻辑 url = "https://example.com" req = requests.get(url) bs0bj = BeautifulSoup(req.text, "html.parser") data = bs0bj.find_all('div', {"class": "exampleClass"})[0].text.strip() @app.route('/') def home(): with open('index.html', 'r', encoding='utf-8') as f: page = f.read() # 转义特殊字符避免破坏页面结构 safe_data = html.escape(data) page = page.replace('{{data}}', safe_data) return page
方案二:不使用Flask,直接生成静态页面
如果不需要动态接口能力,完全可以在爬虫执行完成后直接把数据写入根目录的index.html,不需要启动Web框架做数据传递,后续用任意静态文件服务托管根目录即可,资源占用更低。
实现代码:
from bs4 import BeautifulSoup import requests import html # 爬虫逻辑 url = "https://example.com" req = requests.get(url) bs0bj = BeautifulSoup(req.text, "html.parser") data = bs0bj.find_all('div', {"class": "exampleClass"})[0].text.strip() safe_data = html.escape(data) # 替换模板内容后写回index.html with open('index.html', 'r', encoding='utf-8') as f: page = f.read() page = page.replace('{{data}}', safe_data) with open('index.html', 'w', encoding='utf-8') as f: f.write(page)
如果需要在服务器对外提供访问,直接在项目根目录执行python -m http.server 你要用的端口号就能启动静态服务,不需要额外安装依赖。
注意:如果需要定时更新数据,把上述爬虫+写文件的逻辑做成定时任务即可,不需要常驻运行Web服务。
内容的提问来源于stack exchange,提问作者user19475843
相关产品推荐
相关产品推荐

