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

相关推荐
大脑经常闹风暴@小猿6 小时前
Django 启用国际化支持—实现配置多国语言
后端·python·django
_.Switch10 小时前
高效Django随机查询优化方案
后端·python·django
火龙谷12 小时前
django---tinymce编辑器
开发语言·python·django
codists14 小时前
《Django 5 By Example》阅读笔记:p17-p53
python·django
Spy9720 小时前
django 过滤器的执行
后端·python·django
_.Switch20 小时前
Django SQL 查询优化方案:性能与可读性分析
开发语言·数据库·python·sql·django·sqlite·自动化
Amo Xiang20 小时前
Django 2024全栈开发指南(三):数据库模型与ORM操作(上篇)
数据库·django·django-orm
codists2 天前
《Django 5 By Example》阅读笔记:p76-p104
python·django·编程人
Amo Xiang2 天前
Django 2024全栈开发指南(一):框架简介、环境搭建与项目结构
python·django
Amo Xiang2 天前
Django 2024全栈开发指南(二):Django项目配置详解
python·django