面试题答案
一键面试Flask示例
- 框架配置
- 在Flask应用中,可以通过配置项来定义文件存储的根目录。例如:
from flask import Flask app = Flask(__name__) UPLOAD_FOLDER = '/var/www/uploads' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
- 这样明确指定绝对路径作为上传文件夹,避免相对路径带来的不确定性和潜在的路径遍历风险。
- 文件操作函数
- 使用
os.path.join
函数来拼接路径,确保路径的正确性和安全性。当保存上传文件时:
import os from flask import request @app.route('/upload', methods=['POST']) def upload_file(): file = request.files['file'] if file: filename = file.filename # 确保文件名安全,这里可以使用更复杂的文件名清理函数 clean_filename = filename.replace('..', '') save_path = os.path.join(app.config['UPLOAD_FOLDER'], clean_filename) file.save(save_path) return 'File uploaded successfully' return 'No file part'
- 在上述代码中,
os.path.join
会根据操作系统的规则正确拼接路径,并且通过清理文件名(这里简单替换..
)来防止路径遍历攻击。
- 使用
Django示例
- 框架配置
- 在Django的
settings.py
文件中配置文件存储路径:
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) MEDIA_ROOT = os.path.join(BASE_DIR,'media') MEDIA_URL = '/media/'
MEDIA_ROOT
指定了文件存储的绝对路径,MEDIA_URL
用于在模板中引用这些文件。
- 在Django的
- 文件操作函数
- 在视图函数中处理文件上传:
from django.http import HttpResponse from django.shortcuts import render from django.core.files.storage import FileSystemStorage def upload_file(request): if request.method == 'POST' and request.FILES['file']: file = request.FILES['file'] fs = FileSystemStorage(location=settings.MEDIA_ROOT) filename = fs.save(file.name, file) uploaded_file_url = fs.url(filename) return HttpResponse('File uploaded successfully') return render(request, 'upload.html')
FileSystemStorage
使用在settings.py
中配置的MEDIA_ROOT
作为存储位置,Django内部会处理路径拼接和安全性,确保不会发生路径遍历攻击。同时,使用绝对路径存储文件也有利于性能优化,因为文件系统在处理绝对路径时可以更高效地定位文件。