Python提供HTTP文件服务的几种方式
Python提供HTTP文件服务的几种方式
Python有多种方式可以用来提供HTTP文件服务,以下是主要的几种方法:
1. 使用内置模块
http.server (Python 3)
python -m http.server 8000
# 或指定目录
python -m http.server 8000 --directory /path/to/files
SimpleHTTPServer (Python 2)
python -m SimpleHTTPServer 8000
2. 使用第三方Web框架
Flask
from flask import Flask, send_from_directory
import os
app = Flask(__name__)
@app.route('/files/<path:filename>')
def download_file(filename):
    directory = '/path/to/files'
    return send_from_directory(directory, filename, as_attachment=True)
if __name__ == '__main__':
    app.run(port=8000)
FastAPI
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
app = FastAPI()
app.mount("/files", StaticFiles(directory="/path/to/files"), name="files")
Django
# 在urls.py中添加
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
    # ...其他路由
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
3. 专用文件服务库
aiohttp
from aiohttp import web
import os
async def handle(request):
    name = request.match_info.get('name', "")
    if not name:
        raise web.HTTPNotFound()
    
    file_path = os.path.join('/path/to/files', name)
    if not os.path.exists(file_path):
        raise web.HTTPNotFound()
    
    return web.FileResponse(file_path)
app = web.Application()
app.add_routes([web.get('/{name}', handle)])
web.run_app(app, port=8000)
Twisted
from twisted.web.static import File
from twisted.web.server import Site
from twisted.internet import reactor
resource = File('/path/to/files')
factory = Site(resource)
reactor.listenTCP(8000, factory)
reactor.run()
4. 其他工具
pyftpdlib (FTP服务)
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
authorizer = DummyAuthorizer()
authorizer.add_anonymous("/path/to/files")
handler = FTPHandler
handler.authorizer = authorizer
server = FTPServer(("0.0.0.0", 21), handler)
server.serve_forever()
webdav
from wsgidav.wsgidav_app import WsgiDAVApp
from wsgidav.fs_dav_provider import FilesystemProvider
provider = FilesystemProvider("/path/to/files")
app = WsgiDAVApp({
    "provider_mapping": {"/": provider},
    "verbose": 1,
})
# 可以使用任何WSGI服务器运行,如:
from wsgiref.simple_server import make_server
httpd = make_server("", 8000, app)
httpd.serve_forever()
选择建议
- 快速测试:使用内置的
http.server - 简单服务:Flask或FastAPI
 - 高性能:aiohttp或Twisted
 - 需要WebDAV功能:wsgidav
 - FTP服务:pyftpdlib
 
根据您的具体需求(性能、功能、安全性等)选择合适的方案。


