Django全栈开发学习笔记(四)——FBV视图中的HTTP请求对象

2FBV视图中的HTTP请求对象

2.1获取请求信息

HTTP请求分为8中情况

OPTIONS 返回服务器针对特定资源所支持的请求方法
GET 向特定资源发出请求(访问页面)
POST 向指定资源提交数据处理请求(提交表单,上传文件)
PUT 向指定资源位置上传数据内容
DELETE 请求服务器删除request-URL所标识的资源
HEAD 与GET类似,用与获取报头
TRACE 回复和显示服务器收到的请求,用于测试和诊断
CONNECT 将连接改为管道方式(HTTP/1.1协议)

其中GET和POST最为常用,这两种请求都是可以设置请求参数的:

  • GET请求的请求参数是在路由地址后添加“?”和参数内容,参数内容以key=value形式标识,等号前是参数名,等号后是参数值,如果涉及多个参数,就是用“&”分隔。
  • POST请求的请求参数是以表单的形式传递,常见的表单使用HTML的form标签,并且form标签的method属性设置为POST。

请求方法示例如下:

from django.shortcuts import render

def index(request):
    # 使用method属性判断请求方式
    if request.method == 'GET':
        # 类方法的使用
        print(request.is_secure())
        print(request.is_ajax())
        print(request.get_host())
        print(request.get_full_path())
        print(request.get_raw_uri())
        # 属性的使用
        print(request.COOKIES)
        print(request.content_type)
        print(request.content_params)
        print(request.scheme)
        # 获取GET请求的请求参数
        print(request.GET.get('user', ''))
        return render(request, 'index.html')
    elif request.method == 'POST':
        # 获取POST请求的请求参数
        print(request.POST.get('user', ''))
        return render(request, 'index.html')

templates中的index.html

<!DOCTYPE html>
<html>
<body>
<h3>Hello world</h3>
<form action="" method="POST">
    {% csrf_token %}
    <input type="text" name="user"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

视图函数index中的request是WSGIRequest的实例化对象,通过参数request的method属性来判断HTTP请求方式。

Django接收到HTTP请求后,会根据HTTP请求携带的参数以请求信息来创建一个WSGIRequest对象,并且作为视图函数的首个参数,通常写成request。
WSGIRequest类的属性说明:

COOKIE 获取客户端的Cookie信息,以字典形式表示,并且键值对都是字符串类型
FILES django.http.request.QueryDict对象,包含所有文件上传信息
GET 获取GET请求参数
POST 获取POST请求参数
META 获取客户端请求头信息,以字典形式存储
method 获取当前请求的请求方式(GET,POST)
path 获取当前请求的路由地址
session 一个类似于字典的对象,用来操作服务器的会话信息,可以临时存放用户信息
user 当Django启用AuthenticationMiddleware中间件时才可用。它的值是内置数据模型User的对象,表示当前登录用户。如果用户没有登录那么user将设为django.contrib.auth.models.AnonynousUser的一个实例。

2.2文件上传

代码实例:

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')
<!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,就会触发上传功能,运行过程如下:

  1. 模板文件upload.html使用form标签的文件控件file生成文件上传功能,该控件将用户上传的文件以二进制读取,读取方式由form标签的属性enctype="multipart/form-data"设置。
  2. 浏览器将用户上传的文件读取后,通过HTTP的POST请求将二进制数据传到Django,当Django收到POST请求后,从请求对象的属性FILES获取文件信息,然后在D盘的upload文件夹里创建新的文件,文件名与用户文件名相同。
  3. 从文件信息对象myFile.chunks()读取文件内容,并写入D盘upload文件夹的文件中,从而完成上传功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烧麦Sn0wSt@r

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值