Python 是一种广泛应用于 Web 开发的编程语言,而 Web 框架则是构建 Web 应用程序的关键工具。在众多 Python Web 框架中,Django、Flask 和 FastAPI 是最受欢迎的几个。这些框架都提供了丰富的模块和功能,其中文件系统模块是开发者必须掌握的重要部分。本文将详细解析 Python Web 框架中的文件系统模块应用技巧,帮助开发者轻松应对文件上传、下载和存储等操作。
文件上传
文件上传是 Web 应用程序中常见的功能,允许用户将文件上传到服务器。以下是在 Django、Flask 和 FastAPI 中实现文件上传的示例:
Django
from django.core.files.storage import FileSystemStorage
from django.http import HttpResponse
def upload_file(request):
if request.method == 'POST':
uploaded_file = request.FILES['file']
fs = FileSystemStorage()
filename = fs.save(uploaded_file.name, uploaded_file)
uploaded_file_url = fs.url(filename)
return HttpResponse(f'File uploaded at {uploaded_file_url}')
return HttpResponse("GET request only")
Flask
from flask import Flask, request, redirect, url_for
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['ALLOWED_EXTENSIONS'] = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return redirect(request.url)
file = request.files['file']
if file.filename == '':
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('uploaded_file', filename=filename))
return 'File not allowed'
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return redirect(url_for('static', filename=os.path.join('uploads', filename), _external=True))
if __name__ == '__main__':
app.run()
FastAPI
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.post("/upload/")
async def create_upload_file(file: UploadFile = File(...)):
file_content = await file.read()
file_name = file.filename
with open(f"{file_name}", "wb+") as f:
f.write(file_content)
return {"filename": file_name}
文件下载
文件下载是文件上传的逆操作,允许用户从服务器下载文件。以下是在 Django、Flask 和 FastAPI 中实现文件下载的示例:
Django
from django.http import HttpResponse
from django.conf import settings
def download_file(request, filename):
file_path = os.path.join(settings.BASE_DIR, 'uploads', filename)
if os.path.exists(file_path):
with open(file_path, 'rb') as f:
response = HttpResponse(f.read(), content_type="application/octet-stream")
response['Content-Disposition'] = f'attachment; filename="{filename}"'
return response
return HttpResponse("File not found")
Flask
from flask import Flask, send_from_directory
app = Flask(__name__)
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory('uploads', filename)
if __name__ == '__main__':
app.run()
FastAPI
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/download/")
async def download_file(file: UploadFile = File(...)):
file_content = await file.read()
file_name = file.filename
with open(f"{file_name}", "wb+") as f:
f.write(file_content)
return {"filename": file_name}
文件存储
文件存储是文件上传和下载的基础,涉及到文件在服务器上的保存位置和访问权限。以下是在 Django、Flask 和 FastAPI 中实现文件存储的示例:
Django
from django.core.files.storage import FileSystemStorage
fs = FileSystemStorage(location='uploads')
def save_file(filename, file_content):
with fs.open(filename, 'wb') as f:
f.write(file_content)
Flask
import os
UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return redirect(request.url)
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(UPLOAD_FOLDER, filename))
return redirect(url_for('uploaded_file', filename=filename))
return 'File not allowed'
FastAPI
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
file_content = await file.read()
file_name = file.filename
with open(f"{file_name}", "wb+") as f:
f.write(file_content)
return {"filename": file_name}
总结
本文详细解析了 Python Web 框架中的文件系统模块应用技巧,包括文件上传、下载和存储。通过学习本文,开发者可以轻松应对文件操作,提高 Web 应用程序的实用性。在实际开发过程中,请根据具体需求选择合适的框架和模块,并注意文件存储的安全性。
