django视图(request请求response返回值)

news2024/11/29 10:54:10

一、视图函数介绍

视图就是应用中views.py中定义的函数,称为视图函数

def index(request):
    return HttpResponse("hello world!")


1、视图的第一个参数必须为HttpRequest对象,还可能包含下参数如通过正则表达式组获取的位置参数、通过正则表达式组获得的关键字参数。

2、HttpRequest对象包含了请求的所有数据(请求头、请求体)

3、视图函数必须得返回一个HttpResponse对象或者其子类对象。

子对象: JsonResponse HttpResponseRedirect

4、视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者
响应内容可以是HTML内容,404错误,重定向,json数据…

二、HTTPRequest对象(get请求与post请求)

网址中问号前边表示路由,问号后面表示查询字符串

http://127.0.0.1:8000/orders/getOrders/12345?name=zhangsan&age=18

路由:orders/getOrders/12345/

查询字符串:name=zhangsan&age=18

HttpRequest对象的属性GET、POST都是QueryDict类型的对象

2.1  url路径参数(前端向后端传递参数)

如请求:

http://127.0.0.1:8000/orders/getOrders/12345?name=zhangsan&age=18

url中,12345 要求是一个数字类型的变量。

在url中的变量参数。

在url路径中传递的参数
在请求实例方法中,使用关键字参数来接收

如:

路由配置

path("getOrders/<int:order_id>/",views.OrdersView.as_view()),

视图接收变量

    def get(self,request,order_id):
        print(request)
        order_data_dic = {
            'id': order_id,
            'name': '电脑',
            'price': '500¥'
        }

变量名称在两处要保持一致。

2.2  get 请求传参

HttpRequest对象的属性GET、POST都是QueryDict类型的对象

get请求,有两种形式的传参。

2.3.1  url ?后面的key value键值对参数

如 http://www.xxx.com/?key1=value1&key2=value2

views视图函数中获取传参方式,使用request.GET获取:

1、request.GET返回QueryDict (用户在url传参数的整个数据体),类似于python中dict类型

2、想要获取请求中的具体某个字段:

  • 方法get():根据键获取值

可以使用['key1']、get('key1'),会返回具体的值,如果有多个相同key的键值对,获取的是最后一个

3、getlist('key1'),获取相同key的多个值,返回list类型

  • 方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值

举例:

1、视图函数,获取传参

def get_demo(request):
    request_obj = request.GET
    name = request_obj["name"]
    age = request_obj.get("age")
    json_data = {
        "name":name,
        "age":age,
        "request_obj":request_obj
    }
    return JsonResponse(json_data)

2、配置路由

path('get_demo/',views.get_demo),

 

注意:

1、查询字符串不区分请求方式,如果客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

2.3.3  get 请求传参为json

2.3 POST请求&请求体

HttpRequest对象的属性GET、POST都是QueryDict类型的对象。

请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。

可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。

Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件,

#'django.middleware.csrf.CsrfViewMiddleware',

2.3.1 POST请求 表单类型 Form Data

前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。

1、创建post 视图函数,通过request.POST属性获取传参数

def post_test1(request):
    if request.method == 'GET':
        return HttpResponse("这是一个get请求")
    elif request.method == 'POST':
        name = request.POST.get('name')
        age = request.POST.get('age')
        json_data = {
            "name": name,
            "age": age,
            "response_obj": request.POST
        }
        return JsonResponse(json_data)
    else:
        return HttpResponse("这是一个其他类型的请求")

2、配置路由

path('post_test1/',views.post_test1)

3、创建post请求,请求体为Form表单

报错处理

1、 RuntimeError: You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000/orders/post_test2/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

客户端,在请求时,url 不是以/结尾的。必须以/结尾。

错误的url:http://127.0.0.1:8000/orders/post_test2

正确的url: http://127.0.0.1:8000/orders/post_test2/

2.3.2 POST请求 请求体为JSON

请求体为JSON或者XML,都属于非表单类型 Non-Form Data。
非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。

request.body返回bytes类型。

1、创建post 视图函数,通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。

def post_test2(request):
    if request.method == 'POST':
        # request.body 为<class 'bytes'>类型的json
        request_json = request.body
        # 将 bytes/str类型的json转成字典
        request_dic = json.loads(request_json)
        # 解析字典,取数据
        name = request_dic.get("name")
        age = request_dic.get("age")
        return HttpResponse(f"我的名字是{name},今年{age}岁")
    else:
        return HttpResponse("这是一个其他类型的请求")

2、配置路由

path('post_test2/',views.post_test2),

3、创建 post 请求体为json的请求

 

其他:

1、json格式的字符串,与字典相互转换

json.loads  将json格式的字符串,转为字典

json.dumps 将字典,转成json格式的字符串

三、请求头

可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。

四、HttpResponse

格式:

HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)

 a.第一个参数(响应体)必须为字符串类型
 b.content_type可以指定响应头中的Content-Type参数
 c.status可以指定响应状态码

json_str = json.dumps(project_data, ensure_ascii=False)
return HttpResponse(f"<h1>获取项目{pk}信息</h1>")
return HttpResponse(json_str, content_type='application/json', status=201)

六、JsonResponse

HttpResponse的子类

实现功能:

JsonResponse用于返回json数据(用户端接收的数据)

若要返回json数据,可以使用JsonResponse来构造响应对象,作用:

  • 帮助我们将数据转换为json字符串
  • 设置响应头Content-Type为application/json

服务端在组装JsonResponse数据时,可以传入字典类型的数据,也可以传入嵌套字典的列表)

字典类型的数据:

return JsonResponse(dict_data)

嵌套字典的列表:

必须设置safe=False。关掉安全模式

 return JsonResponse(project_data_list, safe=False)


  #   c.第一个参数可以直接传递字典或者嵌套字典的列表
  #   d.默认添加content_type为application/json
  #   e.默认第一个参数只能为字典,如果为嵌套字典的列表,需要

return JsonResponse(project_data, json_dumps_params={'ensure_ascii': False}, status=201)

 

 
 

2.1 get请求

 如 http://127.0.0.1:8000/orders/getOrders/12345?name=zhangsan&age=18

整个url中,url中的变量为 12345

传参为  name=zhangsan&age=18

三、视图类

使用视图类:

  1. 配置URLconf
  2. 在应用/views.py中定义视图

3.1 定义视图类

1、在views.py中,定义视图类。

2、必须继承View或者View子类

3、不同的请求方法有相应的方法进行对应。

        GET   ->   get
        POST  ->   post
        PUT   ->   put
        DELETE ->  delete
        PATCH  -> patch


 4、每一个处理请求的方法,必须得返回HttpResponse对象或者HttpResponse子类对象
 5、每一个处理请求的方法,第二个参数必须为HttpRequest对象

class OrdersView(View):

    # GET   ->   get 方法
    def get(self,request,order_id):
        order_data_dic = {
            'id': order_id,
            'name': '电脑',
            'price': '500¥'
        }
        return JsonResponse(order_data_dic)

    # POST  ->   post
    def post(self,request,order_id):
        return HttpResponse(f"{order_id}的post请求")

3.2 定义视图类的路由

样式:类视图.as_view()

 path("getOrders/<int:order_id>/",views.OrdersView.as_view())

具体代码如下:

from django.urls import path

from . import views

urlpatterns = [
    path('get/',views.get_order),
    path('delete/',views.delete_order),
    path('get_goods_info/<int:goods_id>/',views.get_goods_info),
    
    # 定义定义类视图的路由条目
    # 样式:类视图.as_view()
    path("getOrders/<int:order_id>/",views.OrdersView.as_view())
]

其他:

在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如

url(r'^',include('book.urls',namespace='book'))

命名空间表示,凡是book.urls中定义的路由,均属于namespace指明的book名下。
 

3.3 效果演示

postman get请求 视图类

http://127.0.0.1:8000/orders/getOrders/12345/

 

 

postman post请求 视图类


   


 

七、两种开发模式

 # 1.前后端不分离的开发模式
        #   a.后端如果返回的是一个完整的html页面(页面中有填充数据)

 # 2.前后端分离的开发模式
 #   a.后端如果返回的是数据(json、xml)

return JsonResponse(project_data_list, json_dumps_params={'ensure_ascii': False}, status=201, safe=False)

 
 

返回值

1、字典

2、嵌套字典的列表

1、字典

    project_data = {
            'id': 1,
            'name': 'xxxx项目',
            'leader': '潘潘达'
        }

2、嵌套字典的列表

        project_data_list = [
            {
                'id': 1,
                'name': 'xxxx项目',
                'leader': '潘潘达'
            },
            {
                'id': 2,
                'name': 'yyyy项目',
                'leader': '多喝热水'
            },
            {
                'id': 3,
                'name': 'zzzz项目',
                'leader': '不语'
            }
        ]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VBA——01篇(入门篇——简单基础语法)

VBA——01篇&#xff08;入门篇——简单基础语法&#xff09; 1. 语法格式1.1 简单语法1.2 简单例子 2. 变量2.1 常用数据类型2.2 声明变量的常用方式2.3 简单例子 3. 单元格赋值3.1 直接赋值3.2 拷贝单元格 4. 简单的逻辑语法4.1 简单if4.2 简单for循环4.2.1 简单语法例子4.2.…

基于混合整数二阶锥(MISOCP)的配电网重构(附matlab代码)

参考资料&#xff1a;主动配电网网络分析与运行调控 (sciencereading.cn) 配电网重构是指在满足配电网运行基本约束的前提下&#xff0c;通过改变配电网中一个或多个开关的状态对配电网中一个或多个指标进行优化。通过配电网重构&#xff0c;可以在不增加设备投资的情况下&…

注解实现:判空赋值

工作中的小玩意~~ 流程&#xff1a; 注解实现反射工具类 注解定义及实现 注解定义&#xff1a; Documented Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface CheckParam {String value() default "-1"; }简单解释上述其相关注解…

哈工大2023春计算机组成原理真题回忆

仅供同学参考&#xff0c;严禁用作商业用途 如发现将追究责任 2023-5-14 属鼠经历了计算机组成原理考试 现将本人真题回忆如下&#xff1a;欢迎大家补充&#xff0c;并期待大家一起参与这个开源的项目。 致谢:真诚感谢草履虫同学提供的图片 15个选择部分回忆如下 &#xff1a…

【历史上的今天】4 月 13 日:Damn Small Linux 首次发布;谷歌关闭短网址服务;数学先驱出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 13 日&#xff0c;在 2006 年的今天&#xff0c;盛大文学榕树下网站被民营企业收购&#xff1b;原创文学网站榕树下被民营传媒集团欢乐传媒收购&#xff…

hnust 湖南科技大学 2023 软件测试技术 期中考试 复习资料

前言 写的比较匆忙&#xff0c;重点也不明确&#xff0c;没什么参考价值致谢&#xff1a;ly&#xff0c;zxq重点来源&#xff1a;信安※&#xff1a;补充内容★&#xff1a;重点✦&#xff1a;个人推测考点考试范围&#xff1a;1-9章获取最新版本 题型 判断&#xff1a;10简…

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1)

AMBER分子动力学模拟之TOP准备-- HIV蛋白酶-抑制剂复合物(1) 我们以HIV蛋白酶-抑制剂复合物为例子&#xff0c;跑Amber动力学模拟 下载1phv 从PBD下载文件&#xff1a;https://www.rcsb.org/ PDB文件预处理 我们以 “protein(water) ligandcomplex” 为例来说一下如何处…

系统设计基本原理-耦合与内聚

耦合 耦合是模块之间的相互独立性(互相连接的紧密程度)的度量&#xff0c;耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型等。 耦合类型 无直接耦合&#xff1a;指两个模块之间没有直接的关系&#xff0c;它们分别从属于不同模块的控制与调用&…

k8s基础11——安全控制之RBAC用户授权、RBAC用户组授权、SA程序授权

文章目录 一、K8s安全框架1.1 鉴权1.1.1 HTTPS证书认证1.1.2 HTTP Token认证 1.2 授权1.3 准入控制1.4 集群四大角色 二、RBAC给用户授权&#xff08;TLS&#xff09;2.1 签发客户端证书2.2 生成kubeconfig授权文件2.2.1 手动生成2.2.2 脚本生成2.2.3 切换操作集群 2.3 定义RBA…

移动应用开发实验-内容提供者-ContentResolver的使用

文章目录 前言读取通讯录信息要求环境 具体实现主页面布局(activity_main.xml)关于RecyclerView库的相关问题添加RecyclerView库操作 解决报错Item布局(info.xml)添加访问权限编写实体类&#xff08;ContactInfo.java&#xff09;编写适配器&#xff08;MyAdapter.java&#xf…

20 散列表的查找

散列表的查找 简介&#xff1a;散列表&#xff08;也成哈希表&#xff09;是一种高效的数据结构&#xff0c;他可以在平均复杂度为O(1)的情况下实现查找、插入和删除操作。 哈希表的基本思想是根据关键字的值来计算其应存储的位置。这个计算过程就是通过哈希函数来实现的。 根…

计算机视觉——day 91基于双网络的鲁棒特征高光谱目标检测(偏门且很水啊)

基于双网络的鲁棒特征高光谱目标检测 I. INTRODUCTIONII. 提出的方法A. 总体框架B.训练集构建C. Dual Networks III. EXPERIMENTSIV. 结论 I. INTRODUCTION 用于高光谱目标检测的深度网络训练通常面临样本有限的问题&#xff0c;在极端情况下&#xff0c;可能只有一个目标样本…

黑盒测试方法

1 等价类划分 1.1 定义 等价类划分法是一种典型的&#xff0c;并且是最基础的黑盒测试用例设计方法。采用等价类划分法时&#xff0c;完全不用考虑程序内部结构&#xff0c;设计测试用例的唯一依据是软件需求规格说明书。 所谓等价类&#xff0c;是输入条件的一个子集合&…

kali整体版本更新方法,为啥更新?

玩过kali都知道&#xff0c;如果不更新版本&#xff0c;那么安装某个软件总是有很多依赖版本问题&#xff0c;解决起来的确麻烦&#xff0c;这篇文章彻底解决这些问题。 1&#xff0c;更新源 国外源与国内源的选择 kali默认配置的是国外源&#xff0c;但国外源的下载速度非常慢…

基于容器和Kubernetes的应用无限扩容

基于应用负载动态管理CPU、内存等资源的使用是云原生架构的最佳实践之一&#xff0c;Kubernetes通过资源请求和限制以及HPA/VPA等机制&#xff0c;为云原生应用资源管理提供了很好的支持。原文: Infinite Scaling with Containers and Kubernetes[1] 如果没有足够资源让容器完成…

matlab第八章_Simulink简介

目录 Simulink简介 基本知识 Simulink组成 模块库简介 Simulink系统仿真 Stateflow建模与应用 Stateflow的定义 状态图编辑器 Stateflow流程图 Simulink简介 基本知识 Simulink是实现动态系统建模&#xff0c;仿真和分析的软件包&#xff0c;被广泛应用于线性系统&…

土地报征简介

报征概念&#xff1a; 土地报征是指国家为了人民整体利益出发&#xff0c;根据我国相关法律和法规的要求和流程&#xff0c; 将集体土地性质转化为国有土地性质&#xff0c;并给予被征地的对象给予合理的补偿和安置工作。报征4个价段&#xff1a; 1、组卷阶段 &#xff08;1&…

Linux系统之top命令的基本使用

Linux系统之top命令的基本使用 一、top命令介绍二、检查本地环境1. 检查操作系统版本2. 检查系统内核版本 三、top命令的使用帮助1. top命令的选项2. top命令的交换命令 四、top显示信息解释1. top的第一行解释2. top的第二、三行信息解释3. top的第四、五行信息解释4. top的进…

Java 常用注解的使用

在Java中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它提供了一种机制&#xff0c;可以将元数据与代码一起存储&#xff0c;并使其可用于编译器、解释器或其他工具的处理。注解可以在Java源代码中添加元数据&#xff0c;以提供更多的信息&…

【Linux】Linux基本指令(3)

一.时间的相关指令 date显示 单纯的输入 date 会以这种形式输出&#xff1a; 但其实这种形式我们看着是不太习惯的&#xff0c;我们可以指定形式输出&#xff1a; 格式为&#xff1a;date 选项 %H : 小时(00..23) %M : 分钟(00..59) %S : 秒(00..61) %X : 相当于 %H:%M:%S %d …