最近整了一些里番,打算细细评鉴。当然是躺在床上评鉴最为惬意。虽然有移动硬盘,也有转接头,但是似乎是华为手机的问题,连上后会自动生成一些文件,而且还难以删除,我接受不了。因为在家里,手机和电脑在同一局域网,那就用Python搭建一个本地文件服务器好了。
代码实现
from flask import Flask, send_file, abort, render_template_stringfrom gevent.pywsgi import WSGIServerimport osimport socketimport qrcode app = Flask(__name__) HTML_TEMPLATE = '''<!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> <title>Local File Server</title> <style> a { color: #007bff; text-decoration: none; } a:visited { color: #007bff; } </style></head><body> <div class="container"> <table class="table table-hover"> <thead> <tr> <th>File Name</th> </tr> </thead> <tbody> {% for file in files %} <tr> <td><a href="/{{ file[1] }}">{{ file[0] }}</a></td> </tr> {% endfor %} </tbody> </table> </div></body></html>''' @app.route('/<path:filename>')def serve_file(filename): if not os.path.exists(filename): abort(404) if os.path.isfile(filename): return send_file(os.path.join(os.getcwd(), filename)) else: return render_template(filename) @app.route('/')def index(): return render_template("./") def render_template(path): files = os.listdir(path) files_path = map( lambda file: os.path.join(path, file), files ) return render_template_string(HTML_TEMPLATE, files=zip(files, files_path)) def get_local_ip(): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.connect(("8.8.8.8", 80)) local_ip = sock.getsockname()[0] return local_ip if __name__ == '__main__': ip = get_local_ip() port = 1128 url = "http://{}:{}".format(ip, port) print("Server running at {}".format(url)) qr = qrcode.QRCode( version=5, error_correction=qrcode.constants.ERROR_CORRECT_Q, box_size=10, border=4, ) qr.add_data(url) qr.print_ascii() http_server = WSGIServer(('0.0.0.0', port), app, log=None) http_server.serve_forever()
一些小问题
测试时一切顺利。然而,到了晚上,我要开始细细品鉴时,却发现手机无法访问,而电脑端可以正常访问。
经过排查与测试,原因很可能时这样的:程序第一次运行的时候,Windows会询问是否允许通过防火墙,允许后即可正常运行。第二次运行就不会再询问了。但是,因为程序是在移动硬盘里的,重新连接移动硬盘后,一些奇奇怪怪的、我也不太清楚的机制,使得这个程序没有被允许通过防火墙了。
我的解决方法就是新建一个入站规则,让1128端口总是允许连接(特意选的一个不常见的端口号)。