实际上机跑了一下,还是需要一些改动,但改动不大。
用scp分别复制了几个图片文件到img目录里,每次刷新页面都及时更新了,图片文件名也无需固定名称,当然只用一个名字,同名反复覆盖也试了可以。
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
import os
from datetime import datetime
import threading
from bottle import route, run, response, ServerAdapter, static_file
# 可配置的变量
image_dir = os.path.expanduser('~/www/img')
web_root_dir = os.path.expanduser('~/www')
httphost = '0.0.0.0'
httpport = 8080
# index.html页面放入内存中
html_content = ''
def gen_html(srcpath):
global html_content
# 获取文件修改时间
timestamp = os.path.getmtime(srcpath)
modify_time = datetime.fromtimestamp(
timestamp).strftime('%Y-%m-%d %H:%M:%S')
# 获取相对路径
relative_path = os.path.relpath(srcpath, web_root_dir)
# 重新计算图片文件的相对路径
static_path = os.path.join('static', relative_path)
# 生成HTML内容
html_content = f'''<head>
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
</head>
<img src="/{static_path}?t={int(time.time())}" alt="Image"><p>{modify_time}</p>'''
class MyHandler(FileSystemEventHandler):
def on_modified(self, event):
global html_content
if event.is_directory:
return None
if event.event_type == 'modified':
gen_html(event.src_path)
@route('/')
def index():
global html_content
print(html_content)
response.content_type = 'text/html'
return html_content
@route('/static/<filepath:path>')
def server_static(filepath):
return static_file(filepath, root=web_root_dir)
class StoppableServer(ServerAdapter):
def run(self, handler):
from wsgiref.simple_server import make_server, WSGIRequestHandler
if self.quiet:
class QuietHandler(WSGIRequestHandler):
def log_request(*args, **kw): pass
self.options['handler_class'] = QuietHandler
self.server = make_server(
self.host, self.port, handler, **self.options)
self.server.serve_forever()
def stop(self):
self.server.shutdown()
# 初始化页面,picture.jpg文件需存在
gen_html(f'{image_dir}/picture.jpg')
print(html_content)
# 启动文件监听
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path=image_dir, recursive=False)
observer.start()
# 在一个新的线程中运行Bottle服务器
server = StoppableServer(host=httphost, port=httpport)
threading.Thread(target=lambda: run(server=server)).start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
server.stop()
observer.join()
--
FROM 171.88.149.*