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

相关推荐
Java水解20 小时前
Django实现接口token检测的实现方案
后端·django
飞Link20 小时前
【Django】Django 调用外部 Python 程序的完整指南
后端·python·django·sqlite
码界奇点1 天前
基于Django与Vue.js的RBAC权限管理系统设计与实现
vue.js·python·车载系统·django·毕业设计·源代码管理
计算机学姐1 天前
基于Python的智能点餐系统【2026最新】
开发语言·vue.js·后端·python·mysql·django·flask
计算机学姐2 天前
基于Python的在线考试系统【2026最新】
开发语言·vue.js·后端·python·mysql·django·flask
码界奇点2 天前
基于Django REST framework与Vue的前后端分离后台管理系统设计与实现
vue.js·后端·python·django·毕业设计·源代码管理
Q_Q5110082852 天前
python+springboot+django/flask基于深度学习的音乐推荐系统
spring boot·python·django·flask·node.js·php
Q_Q5110082852 天前
python+springboot+django/flask基于深度学习的淘宝用户购物可视化与行为预测系统
spring boot·python·django·flask·node.js·php
Q_Q5110082852 天前
python+django/flask+vue基于spark的西南天气数据的分析与应用系统
spring boot·python·spark·django·flask·node.js
Q_Q5110082852 天前
python+springboot+django/flask基于深度学习的旅游推荐系统
spring boot·python·django·flask·node.js·php