Python(Django) Ajax request.FILES InMemoryUploadedFile

在使用Django项目中,From表单提交了图片集合

var formdata = new FormData();
formdata.append("csrfmiddlewaretoken",'{{ csrf_token }}');
if ($('.js_file')[0].files.length > 0){
    $.each($('.js_file')[0].files, function (index,file) {
        formdata.append("file",file);
    })
}

当我在View.py中获取图片的时候打印

print('-----------:',request.FILES)

结果

<MultiValueDict: {'file': [<InMemoryUploadedFile: wx_friends.png (image/png)>, <InMemoryUploadedFile: wx_qrcode.png (image/png)>, <InMemoryUploadedFile: wx_wechat.png (image/png)>]}>

获取

imgs = request.FILES.get('file')

却只能获取到一个文件.
原因在于django 默认是只处理单个文件上传的,要一次性批量处理多个文件上传就得采用这种方法。MultiValueDict这种字典类是特殊定义的,如果需要取得list 需要调用 getlist方法

所以获取图片的正确方式是

for img in imgs:
    imageName = imagesPath + '/' + img.name
    file = open(imageName, 'wb')
    for chunk in img.chunks():
        file.write(chunk)
    file.close()
<think>我们被要求解析`django.core.handlers.wsgi.WSGIRequest`对象,即Django视图函数中的`request`参数。根据引用,这个对象封装了客户端上传的所有信息。我们需要了解如何从这个对象中提取数据。 引用[1]和[2]指出,WSGIRequest对象是Django在接收到HTTP请求后创建的,并作为视图函数的第一个参数传递。引用[4]详细列出了该对象的常用属性: - `path`: 请求的路径(不包括域名和参数) - `method`: 请求的HTTP方法(如GET, POST) - `GET`: 类似字典的对象,包含所有GET请求的参数 - `POST`: 类似字典的对象,包含所有POST请求的参数(包括表单数据) - `FILES`: 类似字典的对象,包含所有上传的文件 - `COOKIES`: 标准的Python字典,包含所有的cookies - `session`: 一个类似字典的对象,用于操作服务器session - `META`: 包含所有客户端发送的header信息 因此,解析WSGIRequest对象主要就是访问这些属性。 ### 解析方法 1. **获取请求路径**:使用`request.path` 2. **获取请求方法**:使用`request.method` 3. **获取GET参数**:使用`request.GET`,这是一个类似字典的对象,可以按键取值。例如,获取名为`'q'`的参数:`request.GET.get('q')`(避免KeyError,推荐使用`.get()`方法) 4. **获取POST参数**:使用`request.POST`,同样类似字典。例如,获取名为`'username'`的参数:`request.POST.get('username')` 5. **获取上传文件**:使用`request.FILES`。例如,获取名为`'myfile'`的文件:`file = request.FILES.get('myfile')`,然后可以读取文件内容或保存到磁盘。 6. **获取Cookies**:使用`request.COOKIES`。例如,获取名为`'sessionid'`的cookie:`request.COOKIES.get('sessionid')` 7. **访问Session**:使用`request.session`,可以像字典一样使用。例如,获取session中的`'user_id'`:`request.session.get('user_id')` 8. **获取请求头信息**:使用`request.META`,这是一个字典,包含了所有的HTTP头部。注意,Django将请求头转换为大写字母,并加上`'HTTP_'`前缀。例如,获取`User-Agent`:`request.META.get('HTTP_USER_AGENT')`;获取`Content-Type`:`request.META.get('CONTENT_TYPE')`(注意,某些头部如CONTENT_TYPE和CONTENT_LENGTH没有HTTP_前缀)。 ### 示例代码 以下是一个视图函数的示例,展示如何解析WSGIRequest对象: ```python from django.http import HttpResponse def my_view(request): # 请求路径 path = request.path # 请求方法 method = request.method # 获取GET参数 get_param = request.GET.get('param_name', 'default_value') # 带默认值 # 获取POST参数 post_param = request.POST.get('post_param', '') # 获取上传文件 uploaded_file = request.FILES.get('my_file') if uploaded_file: # 处理文件,例如保存到磁盘 with open(uploaded_file.name, 'wb+') as destination: for chunk in uploaded_file.chunks(): destination.write(chunk) # 获取cookie session_id = request.COOKIES.get('sessionid') # 从session中获取数据 user_id = request.session.get('user_id') # 获取请求头 user_agent = request.META.get('HTTP_USER_AGENT') # 构建响应内容 response_content = f""" Path: {path}<br> Method: {method}<br> GET param: {get_param}<br> POST param: {post_param}<br> Session ID from cookie: {session_id}<br> User ID from session: {user_id}<br> User Agent: {user_agent}<br> """ return HttpResponse(response_content) ``` ### 注意事项 - 在访问`request.POST`和`request.FILES`之前,需要确保请求方法是POST(或PUT等带有请求体的方法)。 - 对于文件上传,表单需要设置`enctype="multipart/form-data"`,否则文件不会出现在`request.FILES`中。 - `request.GET`和`request.POST`都是`QueryDict`对象,允许一个键对应多个值。如果需要获取所有值,可以使用`.getlist('key')`方法。 - `request.META`中的键名转换规则:大写,将横线`-`替换为下划线`_`,并加上`HTTP_`前缀(除了CONTENT_TYPE和CONTENT_LENGTH等少数例外)。 通过以上方法,可以解析WSGIRequest对象中的各种数据。 ### 相关问题 1. 如何在Django中获取请求的原始体(raw body)? 2. 如何设置和读取Django的session? 3. Django中如何处理文件上传并保存到指定位置? 4. 如何从Djangorequest对象中获取客户端的IP地址? </think>### Django WSGIRequest 对象解析方法 在 Django 中,`django.core.handlers.wsgi.WSGIRequest` 对象(即视图函数中的 `request` 参数)封装了 HTTP 请求的所有信息。以下是关键属性和解析方法: #### 1. **基础属性解析** ```python # 请求路径 (不含域名和参数) request.path # 如 "/api/users/" # HTTP 请求方法 request.method # 返回 "GET", "POST" 等 if request.method == 'POST': # 处理 POST 逻辑 ``` #### 2. **参数解析** ```python # GET 参数 (URL 参数) search_term = request.GET.get('q') # 获取单个参数 all_params = request.GET.dict() # 获取全部参数的字典 # POST 参数 (表单数据/JSON) username = request.POST.get('username') email = request.POST.get('email', 'default@example.com') # 带默认值 ``` #### 3. **文件上传解析** ```python # 上传文件处理 (需 enctype="multipart/form-data") uploaded_file = request.FILES.get('myfile') if uploaded_file: with open(uploaded_file.name, 'wb+') as destination: for chunk in uploaded_file.chunks(): destination.write(chunk) ``` #### 4. **元数据与头部解析** ```python # HTTP 头部信息 (META 字典) user_agent = request.META.get('HTTP_USER_AGENT') client_ip = request.META.get('REMOTE_ADDR') # Cookie 访问 session_id = request.COOKIES.get('sessionid') ``` #### 5. **会话与状态管理** ```python # Session 操作 (需启用 session 中间件) request.session['user_id'] = 42 # 设置 session user_id = request.session.get('user_id') # 获取 session ``` #### 6. **JSON 数据处理** ```python import json if request.content_type == 'application/json': try: data = json.loads(request.body) # 原始请求体 print(data.get('key')) except json.JSONDecodeError: return HttpResponseBadRequest("Invalid JSON") ``` #### 7. **特殊属性** ```python # 用户认证信息 (需启用认证中间件) if request.user.is_authenticated: print(request.user.username) ``` ### 常见问题解析示例 **GET 参数多值处理** 当 URL 含重复参数 `?id=1&id=2`: ```python ids = request.GET.getlist('id') # 返回列表 [1, 2] ``` **POST 与 JSON 互斥** 注意:`request.POST` 仅适用于表单提交,JSON 数据需通过 `request.body` 解析[^4]。 ### 注意事项 1. 属性访问前检查请求类型: ```python if request.method == 'POST': form_data = request.POST ``` 2. 使用 `.get()` 避免 `KeyError`,提供默认值更安全 3. 大文件需用 `chunks()` 方法分块读取,避免内存溢出[^4] --- ### 相关问题 1. 如何在 Django 中处理 AJAX 发送的 JSON 数据? 2. 如何从 WSGIRequest 对象获取客户端真实 IP(考虑代理)? 3. Django 文件上传时有哪些安全注意事项? 4. 如何扩展 WSGIRequest 对象添加自定义属性? [^1]: WSGIRequest 封装 HTTP 请求信息 [^2]: WSGIRequest 对象属性和方法 [^3]: WSGIHandler 实现原理 [^4]: WSGIRequest 常用属性详解
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值