Django HttpRequest 请求对象


目录


一、概述

Django 中的视图主要用来接受 Web 请求,并作出响应,视图的本质就是一个 Python 中的函数。

1、视图的响应分为两大类

  1. 以 Json 数据形式返回(JsonResponse)

  2. 以网页的形式返回

    1)重定向到另一个网页(HttpResponseRedirect)

    2)错误视图(4xx,5xx)

2、视图响应过程

浏览器 => urls路由匹配 => 视图响应 => 回馈到浏览器

3、视图参数有两种

  1. 一个 HttpRequest 的实例,一般命名为 request,相当于从浏览器传过来

    如下案例,视图函数中的 request 就是一个形式参数,包含来自客户端的所有请求信息。

    py 复制代码
    from django.shortcuts import render
    from book.models import *
    
    # 书籍首页
    def book_index(request):
        return render(request, 'book/book_index.html')
  2. 另一个是自定义参数,一般通过 url 正则表达式传递过来

    如:视图函数自定义 bid 参数,该参数就需要从 url 中传递过来。

    py 复制代码
    from django.shortcuts import render
    from book.models import *
    
    # 书籍详情
    def book_detail(request, bid):
        # 获取bid对应的书籍
        book = Book.objects.get(pk=bid)
        # 组织数据
        context = {
            'book': book
        }
    
        return render(request, 'book/book_detail.html', context)

    因此,我们在 url 路由配置时,就需要定义与视图函数一致的参数。

    py 复制代码
    from django.urls import path
    from book.views import *
    
    urlpatterns = [
        path('index/', book_index, name='index'),
        path('list/', book_list, name='list'),
        path('detail/<int:bid>', book_detail, name='detail'),
    ]

    那这个参数怎么获取呢?手动输入?那肯定不是,而是通过数据库的增删改查来获取具体的参数,并传入,如下案例。

    py 复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>作者</title>
    </head>
    <body>
        <h2>作者详情页</h2>
        <hr>
        <p>作者姓名:{{ author.first_name }}{{ author.last_name }}</p>
        <p>作者邮箱:{{ author.email }}</p>
        <p>作者性别:{{ author.gender }}</p>
        <h4>我的其他作品</h4>
        <ul>
            {% for book in author.book_set.all %}
                <li>
                    <a href="{% url 'book:detail' book.id %}">
                        {{ book.title }}
                    </a>
                </li>
            {% endfor %}
            
        </ul>
    </body>
    </html>

    其案例中 book.id 就是要传入的参数!

4、视图函数所在位置

通常在 APP 应用下的 views.py 中定义视图函数。

二、测试

那我们打印一下视图函数中 request 参数,看看会输出什么内容。

1、视图函数

py 复制代码
def test(request):
    print(request)
    return HttpResponse('ok')

2、路由

子路由

py 复制代码
from django.urls import path
from user.views import index, test

urlpatterns = [
    path('user/', index, name='index'),
    path('request/', test, name='test'),
]

3、访问

4、查看结果

即返回了 <WSGIRequest: GET '/request/'> 请求对象。

你只需要记住 request 就是一个 HttpResponse 对象即可。

三、属性和方法

服务器收到 Http 请求后,会根据报文创建 HttpRequest 对象,视图函数中的第一个参数 request 就是 HttpRequest 对象,django 框架收到 http 请求后会将 http 请求包装为 HttpRequest 对象,之后传递给视图函数。

request 这个 HttpRequest 对象有哪些属性和方法呢?

1、属性

  • path:返回 HTTP 请求的 URL 完整路径;

    注意并不是整个网址,而是路由地址,如果你要获取路由地址及后面的参数可使用 get_full_path() 来获取。

  • method:返回 HTTP 请求的方法,如 GET、POST 等;

  • GET:返回类似字典类型的参数,包含了 GET 请求的所有参数;

  • POST:返回类似字典类型的参数,包含了 POST 请求的所有参数;

  • COOKIES:类似字典,包含了所有 COOKIE;

  • SESSION:类似字典,表示会话;

  • META'REMOTE_ADDR':获取客户端的 IP 地址,注意 REMOTE_ADDR 不要写错了。

2、方法

  • is_ajax():判断是否是 ajax(),通常用在移动端和 JS 中;
  • get_full_path():返回包含参数字符串的请求路径。

四、案例

1、视图函数

py 复制代码
def my_request(request):
    print(request)
    # 属性
    print(request.path)     # 获取请求URL路径
    print(request.method)   # 获取请求方法,GET、POST、...
    print(request.GET)      # 获取GET请求的参数(以类似字典的形式)
    print(request.GET['name'])   # 获取GET请求具体的参数值,但是name如果不存在则会报错,如果有多个name参数,只返回只有一个参数值
    print(request.GET.get('name', default='匿名用户'))  # 获取GET请求具体的参数值,name如果不存在则不会报错,而会返回None值或你自定义的default值,如果有多个name参数,只返回只有一个参数值
    print(request.GET.getlist('name'))   # 会以列表的形式返回你指定的所有参数的值,如果有多个name参数,那这些参数的值都会被获取
    print(request.POST)     # 获取POST请求的参数(以类似字典的形式),如果不是POST请求,则返回{}空字典

    print(request.COOKIES)  # COOKIE会话技术
    print(request.session)  # session会话技术

    print(request.FILES)    # 获取前端上传的文件对象
    print(request.META['REMOTE_ADDR'])  # 获取客户端IP地址
    return HttpResponse('ok')

2、路由

py 复制代码
from django.urls import path
from user.views import index, my_request

urlpatterns = [
    path('user/', index, name='index'),
    path('request/', my_request, name='my_request'),
]

3、请求

http://127.0.0.1:8000/request/?name=lisi\&age=18\&name=zhangsan\&age=55

4、结果

5、浏览器如何查看会话(以谷歌浏览器为例)

---END

相关推荐
可乐鸡翅yeah_6 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
可乐鸡翅yeah_6 小时前
第三方接口对接 M3U8 流媒体排坑实战,解决外部服务商流兼容难题
前端·javascript·python·django·html·m3u8·m3u8在线
可乐鸡翅yeah_9 小时前
个人 / 外包流媒体项目交付实战,M3U8 验收与问题闭环完整工作流
运维·网络·python·低代码·django·m3u8·在线播放
2601_9620652514 小时前
从零创建一个 Django 项目
后端·python·django
千里码aicood15 小时前
Django 基于Django的电脑推荐与分析可视化系统设计与实现
python·django·电脑
汤姆yu16 小时前
基于Django的学习资料共享与智能推荐系统
后端·python·django·毕业设计·学习资料共享
Mr数据杨1 天前
【Codex】用学生入学评估模块建立新生能力画像
android·java·javascript·django·codex·项目开发
Mr数据杨1 天前
【Codex】用部门管理模块维护组织架构与管理层级
架构·django·codex·项目开发
Mr数据杨1 天前
【Codex】用附件管理模块统一维护系统文件资源
django·codex·项目开发
IT毕设实战小研1 天前
基于安卓的空气质量查询系统
android·大数据·vue.js·爬虫·python·django·课程设计