Django中如何在另一个类中获取请求中的文件值?
解决方案
首先纠正你的错误思路:绝对不要在业务类(比如Fruits)里实例化View类来获取请求数据。View是Django用来处理HTTP请求的类,每个请求对应一个独立的View实例,你手动创建的MyView完全没有绑定当前请求的上下文,自然拿不到上传的文件——这是对request生命周期的理解偏差:request只存在于当前HTTP请求的处理流程中,脱离这个流程的实例无法访问它。
下面是几种可行的传递方式,核心思路是将文件数据从View层主动传递到业务类(Fruits),让业务类和请求解耦,代码更清晰可维护:
方式1:直接作为方法参数传递
修改Fruits的方法,让它接受文件参数,在View调用时传入:
class Fruits: ... # 修改get_sample_data,新增attachment参数 def get_sample_data(self, df, attachment): ... data = { 'put_file_attachment': attachment, # 这里使用传入的文件 } # 后续将data存入数据库的逻辑 ... # 如果load_data也需要用到文件,同样可以加参数 def load_data(self, attachment=None): ... # 使用attachment做处理 ... class MyView(FormView): ... def post(self, request, *args, **kwargs): get_file = request.FILES.get('attachment') ... k = Fruits() # 调用时直接传入get_file k.get_sample_data(df, get_file) # 如果load_data需要,也传入 k.load_data(get_file) return self.render_to_response(context)
方式2:赋值为实例属性传递
如果Fruits的多个方法都需要用到这个文件,可以在实例化后直接给属性赋值:
class Fruits: def __init__(self): self.attachment = None # 初始化属性 ... def get_sample_data(self, df): ... data = { 'put_file_attachment': self.attachment, # 使用实例属性 } ... class MyView(FormView): ... def post(self, request, *args, **kwargs): get_file = request.FILES.get('attachment') ... k = Fruits() k.attachment = get_file # 给实例赋值 k.get_sample_data(df) k.load_data() return self.render_to_response(context)
关键原则
- 业务逻辑类(Fruits)应该和HTTP请求解耦,不要直接依赖request对象,这样不仅代码更易测试,也符合分层设计的思想。
- request是请求生命周期内的临时对象,只有处理当前请求的View实例才能正常访问它,跨实例、跨生命周期去获取都是错误的做法。
内容的提问来源于stack exchange,提问作者studyhard
相关产品推荐
相关产品推荐

