Django视图-HttpRequest请求对象和HttpResponse响应对象

文章目录

  • HttpRequest
  • HttpResponse
  • 实践
    • request对象的属性和方法
    • 响应


def index(request):  这个request其实就是内部已经封装好的Http请求HttpRequest,它是一个请求对象

Django中的视图主要用来接受Web请求,并做出响应。
视图的本质就是一个Python中的函数
视图的响应分为两大类
	1) 以json数据形式返回(JsonResponse)
	2) 以网页的形式返回
		2.1) 重定向到另一个网页(HttpResponseRedirect)
		2.2) 错误视图(4xx,5xx)(HttpResponseNotFound,HttpResponseForbidden,HttpResponseNotAllowed等)
视图响应过程:
	浏览器输入-> urls 路由匹配  -> 视图响应 -> 回馈到浏览器
视图参数:
	1)一个HttpRequest的实例,一般命名为request
	2)通过ur1正则表达式传递过来的参数
位置:
	通常在应用下的views.py中定义
		错误视图:
			1404视图(页面没找到)
			2400视图(客户操作错误)
			3) 500视图 (服务器内部错误)

HttpRequest

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

request常用属性和方法
	属性:
		path	请求的完整路径
		method 	请求的方法,常用GET,POST
		GET		类似字典的参数,包含了get的所有参数
		POST	类似字典的参数,包含了post所有参数
		FILES	类似字典的参数,包含了上传的文件
		COOKIES	字典,包含了所有COOKIE
		session	类似字典,表示会话
		META['REMOTE_ADDR']
	方法:
		is_ajax()	判断是否是ajax(),通常用在移动端和JS中
		get_full_path()	返回包含参数字符串的请求路径
QueryDict:	类字典的对象
	类似字典的数据结构。与字典的区别:可以存在相同的键。
	QueryDict中数据获取方式
		dict['uname']dict.get('uname')
		获取指定key对应的所有值
		dict.getlist('uname')

HttpResponse

服务器返回给客户端的数据
HttpResponse由程序员自己创建
	1)不使用模板,直接调用HttpResponse(),返回HttpResponse对象。
	2)调用模板,进行渲染。
	使用render
		render(request,template_name[,context])
		request			请求体对象
		template_name	模板路径
		context			字典参数,用来填坑

属性: 	content		返回的内容
		charset		编码格式
		status_code	响应状态码(2xx,3xx,4xx,5xx)

方法:
		write(xxx)		直接写出文本
		flush()			冲刷缓冲区
		set_cookie(key,value='xxx',max_age=None)	设置cookie
		delete_cookie(key)		删除cookie

HttpResponse子类
	HttpResponseRedirect
		响应重定向:可以实现服务器内部跳转
		return HttpResponseRedict('/grade/2030')
		使用的时候推荐使用反向解析
	JsonResponse
		返回Json数据的请求,通常用在异步请求上
			JsonResponse(dict)
			返回json数据时,Content-type是application/json

实践

新建一个项目 Day05DjangoPro,创建一个应用 叫App

在这里插入图片描述
不写子路由啦,直接写根路由Day05DjangoPro\urls.py

from django.contrib import admin
from django.urls import path
from App.views import *

urlpatterns = [
    path('myrequest/',my_request),
    path('admin/', admin.site.urls),
]

App\views.py

from django.shortcuts import render, HttpResponse


# 请求
def my_request(request):
    print(request)   # 请求对象
    # <WSGIRequest: GET '/myrequest/'>
    return HttpResponse('ok')

http://127.0.0.1:8000/myrequest/

打印得到的是<WSGIRequest: GET ‘/myrequest/’>
WSGIRequest是什么?我们可以看一下
在这里插入图片描述
WSGIRequest 继承 HttpRequest ,HttpRequest 再点开看一下
在这里插入图片描述
QueryDict 继承 MultiValueDict,MultiValueDict继承 dict字典,所以QueryDict 可以当成字典来用。QueryDict 是一个 类字典对象。

request对象的属性和方法

App\views.py

from django.shortcuts import render, HttpResponse


# 请求
def my_request(request):
    print(request)  # 请求对象
    # <WSGIRequest: GET '/myrequest/'>

    # request对象的属性和方法
    print(request.method)  # 请求方式,GET,POST...
    print(request.GET)  # GET请求的参数 <QueryDict: {'name': ['清风'], 'age': ['18']}>
    print(request.GET['name'])  # 第一种方式,如果没有就会报错
    print(request.GET.get('name', default='匿名用户'))  # 第二种方式,如果没有就会返回None或者默认值(跟字典一样dict),不会报错,推荐使用这种方式
    print(request.GET.getlist('name'))  # 第三种,如果name有多个值,则都会获取,以列表[]的形式返回,没有数据就返回空列表[]
    # print(request.POST)  # POST请求的参数 <QueryDict: {}>
    # print(request.POST.get('name', default='匿名用户')) # 也是一样的

    print(request.path)  # 路径,就是我们写的路由 /myrequest/
    print(request.get_full_path())  # 整个路径  /myrequest/?age=18&name=%E6%B8%85%E9%A3%8E&name=%E5%BE%AE%E6%B3%AB

    return HttpResponse('ok')

http://127.0.0.1:8000/myrequest/?age=18&name=清风&name=微泫

在这里插入图片描述

此外还有…

# 请求
def my_request(request):
    print(request)  # 请求对象
    print(request.COOKIES)  # cookie 会话技术
    # {'csrftoken': 'lvQaYuMDgiemswhYomZXc1msPaoSS35J'}
    print(request.session)  # session 会话
    # <django.contrib.sessions.backends.db.SessionStore object at 0x0000023890CB3890>
    print(request.FILES)  # 文件,前端上传的文件对象
    print(request.META['REMOTE_ADDR'])  # 客户端的IP地址

    return HttpResponse('ok')

响应

Day05DjangoPro\urls.py

path('myresponse/', my_response),

App\views.py

from django.http import JsonResponse
from django.shortcuts import render, HttpResponse, redirect, reverse, HttpResponseRedirect


def my_response(request):
    # 1. 返回字符串:企业项目中使用很少
    # return HttpResponse('ok')

    # 2. 返回模板:前后端不分离的时候使用
    # return render(request, 'index.html', {'key1': 'value1', 'key2': 'value2'})

    # 3. 重定向: 页面跳转用的,路径的跳转
    # redirect 和 HttpResponseRedirect是一样的
    # return redirect("https://blog.csdn.net/weixin_59633478/category_12401835.html")
    # return redirect("/request/")
    # return HttpResponseRedirect("/request/")
    # redirect(reverse("命名空间:userdetail", args=(2,)))
    # return redirect(reverse("App:userdetail", kwargs={'uid': 2}))

    # 4. 返回JSON: 前后端分离的情况使用
    return JsonResponse({
        'data': 123
    })


# 请求
def my_request(request):
    print(request)  # 请求对象
    # <WSGIRequest: GET '/myrequest/'>

    # request对象的属性和方法
    # print(request.method)  # 请求方式,GET,POST...
    # print(request.GET)  # GET请求的参数 <QueryDict: {'name': ['清风'], 'age': ['18']}>
    # print(request.GET['name'])  # 第一种方式,如果没有就会报错
    # print(request.GET.get('name', default='匿名用户'))  # 第二种方式,如果没有就会返回None或者默认值(跟字典一样dict),不会报错,推荐使用这种方式
    # print(request.GET.getlist('name'))  # 第三种,如果name有多个值,则都会获取,以列表[]的形式返回,没有数据就返回空列表[]
    # # print(request.POST)  # POST请求的参数 <QueryDict: {}>
    # # print(request.POST.get('name', default='匿名用户')) # 也是一样的
    #
    # print(request.path)  # 路径,就是我们写的路由 /myrequest/
    # print(request.get_full_path())  # 整个路径  /myrequest/?age=18&name=%E6%B8%85%E9%A3%8E&name=%E5%BE%AE%E6%B3%AB

    print(request.COOKIES)  # cookie 会话技术
    # {'csrftoken': 'lvQaYuMDgiemswhYomZXc1msPaoSS35J'}
    print(request.session)  # session 会话
    # <django.contrib.sessions.backends.db.SessionStore object at 0x0000023890CB3890>
    print(request.FILES)  # 文件,前端上传的文件对象
    print(request.META['REMOTE_ADDR'])  # 客户端的IP地址

    return HttpResponse('ok')

在这里插入图片描述


在这里插入图片描述
其实render返回的也是HttpResponse,只不过我们通过render_to_string方法将我们模板也就是html和内容加进去,在它内部会将html内容、模板语法 和 发过去的数据 进行结合做渲染,渲染之后得到的content其实是一个可能很长的html数据,所以返回的也是一个字符串。


App\views.py

def my_response(request):
    response = HttpResponse('ok')
    response.content = 'hello'
    response.status_code = 400
    return response

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/85696.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Eduma主题 - 线上教育WordPress主题/网站

Eduma主题 – 线上教育WordPress主题是为教育网站、LMS、培训中心、课程中心、学院、大学、学校、幼儿园而制作的。基于我们使用以前的主题eLearning WP构建WordPress LMS的经验&#xff0c;Education WP是下一代&#xff0c;也是围绕WordPress最好的教育主题之一&#xff0c;它…

Qt下拉菜单

1&#xff0c;QComboBox 2&#xff0c;setMenu()---设置下拉菜单 AI对话未来丨智能写作对话: setMenu()是QWidget类的一个成员函数&#xff0c;在Qt中用于将一个菜单作为一个控件的下拉菜单设置。具体来说&#xff0c;它会把相应的菜单对象与该控件关联&#xff0c;并在控件上…

PySpark-核心编程

2. PySpark——RDD编程入门 文章目录 2. PySpark——RDD编程入门2.1 程序执行入口SparkContext对象2.2 RDD的创建2.2.1 并行化创建2.2.2 获取RDD分区数2.2.3 读取文件创建 2.3 RDD算子2.4 常用Transformation算子2.4.1 map算子2.4.2 flatMap算子2.4.3 reduceByKey算子2.4.4 Wor…

(一)idea连接GitHub的全部流程(注册GitHub、idea集成GitHub、增加合作伙伴、跨团队合作、分支操作)

&#xff08;二&#xff09;Git在公司中团队内合作和跨团队合作和分支操作的全部流程&#xff08;一篇就够&#xff09;https://blog.csdn.net/m0_65992672/article/details/132336481 4.1、简介 Git是一个免费的、开源的*分布式**版本控制**系统*&#xff0c;可以快速高效地…

mongodb 数据库管理(数据库、集合、文档)

目录 一、数据库操作 1、创建数据库 2、删除数据库 二、集合操作 1、创建集合 2、删除集合 三、文档操作 1、创建文档 2、 插入文档 3、查看文档 4、更新文档 1&#xff09;update() 方法 2&#xff09;replace() 方法 一、数据库操作 1、创建数据库 创建数据库…

hive表的全关联full join用法

背景&#xff1a;实际开发中需要用到全关联的用法&#xff0c;之前没遇到过&#xff0c;现在记录一下。需求是找到两张表的并集。 全关联的解释如下&#xff1b; 下面建两张表进行测试 test_a表的数据如下 test_b表的数据如下&#xff1b; 写第一个full join 的SQL进行查询…

树莓派时间更新为中国区时间

一、测试环境为&#xff1a;树莓派3B piraspberrypi:~/workfile/lorawan/lorawan-gw $ uname -a Linux raspberrypi 6.1.21-v7 #1642 SMP Mon Apr 3 17:20:52 BST 2023 armv7l GNU/Linux 测试过程中&#xff0c;请确保树莓派连接网络 &#xff1b; 二、安装ntp相关命令&…

RK3399平台开发系列讲解(内核调试篇)Valgrind使用案例

🚀返回专栏总目录 文章目录 一、使用未初始化的内存案例二、内存泄露三、在内存被释放后进行读/写案例四、从已分配内存块的尾部进行读/写案例五、两次释放内存案例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Valgrind 是一个开源的内存调试和性能分析工具,用于…

【计算机网络篇】TCP协议

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; TCP协议 1&#xff0c;TCP 简介 TCP&#xff08;Transmission Control Protocol&#xff09;是…

CSS中如何实现文字溢出省略号(text-overflow: ellipsis)效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS中如何实现文字溢出省略号&#xff08;text-overflow: ellipsis&#xff09;效果&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 …

阿里云服务器-修改ecs操作系统,把window系统更换成Linux操作系统

其他sql格式也在更新中&#xff0c;可直接查看这个系列&#xff0c;要是没有你需要的格式&#xff0c;可在评论或私信我 总目录 目录-后期更新打算 hive的nvl中的子查询 总目录我这个是window&#xff0c;默认应该都是window&#xff0c;我需要改成Linux系统第一步&#xff…

如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

排序算法之详解冒泡排序

引入 冒泡排序顾名思义&#xff0c;就是像冒泡一样&#xff0c;泡泡在水里慢慢升上来&#xff0c;由小变大。虽然冒泡排序和冒泡并不完全一样&#xff0c;但却可以帮助我们理解冒泡排序。 思路 一组无序的数组&#xff0c;要求我们从小到大排列 我们可以先将最大的元素放在数组…

UE4/5Niagara粒子特效之拖尾渐变

目录 开始操作 发射器一的制作 添加新的模块 ​编辑 让粒子长久存在 添加颜色 发射器二的制作 第三人称模板添加Niagara 效果 添加颜色 效果 隐藏第一个发射器 开始操作 首先创建一个粒子系统&#xff0c;用Fountain这个模板&#xff1a; 发射器一的制作 将不需要的…

MPLS与SD-WAN哪个更适合企业组网?

MPLS专线和SD-WAN是最为人熟知的两种组网方式&#xff0c;而且二者一个是传统组网方式&#xff0c;一个是新兴产品&#xff0c;所以难免会被放在一起比较。有人会问&#xff0c;MPLS专线和SD-WAN哪个更适合企业组网&#xff1f;其实&#xff0c;MPLS专线和SD-WAN都是企业实现高…

【linux】2 Linux编译器-gcc/g++和Linux调试器-gdb

文章目录 一、Linux编译器-gcc/g使用1.1 背景知识1.2 gcc如何完成1.3 函数库1.4 gcc选项 二、linux调试器-gdb使用2.1 背景2.2 开始使用 总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 一、Linux编译器-gcc/g使用 1.1 背景…

【仿写tomcat】一、tomcat工作流程

仿写tomcat 简介tomcat简介流程分析tomcat是怎么和访问者交互的&#xff1f;流程图 简介 作者前不久刚仿写了一个简易的tomcat&#xff0c;在此分享给各位&#xff0c;此篇为对tomcat的简介和流程分析&#xff0c;具体仿写内容后续会贴在这里 扫描java文件&#xff0c;获取带…

新高-新低指数(NH-NL)指标公式,判断多空力度

在《以交易为生》这本书中&#xff0c;作者埃尔德根据其经验&#xff0c;认为新高-新低指数(NH-NL)是股市的最佳领先指标。在任意一天中&#xff0c;创一年新高的股票是强势股&#xff0c;而创一年新低的股票是弱势股。新高-新低指数通过比较强势股和弱势股的数量来跟踪市场领导…

springMVC 已解密的登录请求

问题描述&#xff1a; 解决方案&#xff1a; 1.对用户所输入的密码在页面进行MD5加密并反馈至密码输入框。 2. 手动生成SSL安全访问证书&#xff1b;在此不做介绍&#xff0c;相关方法可通过网上查找&#xff1b; 3. 将产品HTTP访问方式改为SSL安全访问方式&#xff1b;在Ap…

【JAVA程序设计】基于SpringBoot+vue的在线考试系统-以计算机网络为例,可自行录入题库-附下载地址

基于SpringBootvue的在线考试系统-以计算机网络为例&#xff0c;可自行录入题库 一、项目简介二、开发环境三、项目技术四、功能结构五、运行截图六、功能实现七、数据库设计八、源码获取 一、项目简介 随着信息技术的迅猛发展&#xff0c;教育行业正面临着巨大的变革和挑战。…