HTTP请求对象

网站时根据用户请求来输出相应的响应内容,用户请求是指用户在浏览器上访问某个网址链接操作,浏览器会根据网址链接信息向网站发送HTTP请求,那么,当Django接收到用户请求时,它是如何获取用户请求信息的呢?

1、 获取请求信息

当在浏览器上访问某个网址时,其实质时向网站发送一个HTTP请求,HTTP请求分为8种请求方式,每种请求方式的说明如下:

请求方式

说明

OPTIONS

返回服务器针对特定资源所支持的请求方法

GET

向特定资源发出请求(访问网页)

POST

向指定资源提交数据处理请求(提交表单、上传文件)

PUT

向指定资源位置上传数据内容跟

DELETE

请求服务器删除request-URL所标示的资源

HEAD

与GET请求类似,返回的响应中没有具体内容,用于获取报头

TRACE

回复和显示服务器收到的请求,用于测试和诊断

CONNECT

HTTP/1.1协议中能够将连接改为管道方式的代理服务器

在上述的HTTP的请求方式里,最基本的时GET请求和POST请求,网站开发者关心的也只有GET请求和POST请求。GET请求和POST请求是可以设置请求参数的,两者的设置方式如下:

  • GET请求的请求参数是在路由地址后添加"?“和参数内容,参数内容以key=value形式表示,等号前面的是参数名,后面是参数值,如果涉及多个参数,每个参数之间旧使用”&"隔开,如127.0.0.1:8000/?user=xy&pw=123.
  • POST请求的请求参数一般以表单的形式传递,常见的额表单使用HTML的form标签,并且form标签的method属性设为POST。

2、文件上传功能

文件上传功能是网站开发常见的功能之一,比如上传图片和导入(音频文件、办公文件或安装包等)。无论上传的文件是什么格式的,其上传原理都是将文件二进制的数据格式读取并写入网站指定的文件夹里。通过一个简单的例子来使用Django实现文件上传功能。

# index的urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 定义路由
    path('', views.upload, name='uploaded'),
]

# index的views.py
from django.shortcuts import render
from django.http import HttpResponse
import os

def upload(request):
    # 请求方法为POST时,执行文件上存
    if request.method == "POST":
        # 获取上传的文件,如果没有文件,则默认为None
        myFile = request.FILES.get("myfile", None)
        if not myFile:
            return HttpResponse("no files for upload!")
        # 打开特定的文件进行二进制的写操作
        f = open(os.path.join("D:\\upload", myFile.name), 'wb+')
        # 分块写入文件
        for chunk in myFile.chunks():
            f.write(chunk)
        f.close()
        return HttpResponse("upload over!")
    else:
        # 请求方法为GET时,生成文件上存页面
        return render(request, 'upload.html')

# templates的upload.html
<!DOCTYPE html>
<html>
<body>
<form enctype="multipart/form-data" action="" method="post">
   {% csrf_token %}
   <input type="file" name="myfile" />
   <br>
   <input type="submit" value="上存文件"/>
</form>
</body>
</html>

从视图函数upload可以看到,如果当前HTTP请求为POST,就会触发文件上传功能。其运行过程如下:

  • 模板文件upload.html使用from标签的文件控件file生成文件上传功能,该控件将用户上传的文件以二进制读取,读取方式由form标签的属性enctype="multipart/form-data"设置。
  • 浏览器将用户上传的文件读取后,通过HTTP的POST请求将二进制数据传到Django,当Django收到POST请求后,从请求对象的属性FILES获取文件信息,然后再D盘的upload文件夹里创建新的文件,文件名(从文件信息对象myFile.name获取)与用户上传的文件名相同。
  • 从文件信息对象myFile.chunks()读取文件内容,并写入upload文件夹的文件中,从而实现文件上传功能。