当前位置: 首页 > news >正文

Django框架——请求与响应

上篇文章我们学习了Django框架——配置文件和视图函数,这篇文章我们学习Django框架——请求与响应。

客户端和服务端的请求与响应过程:客户端访问某个网站并发出URL请求,服务器接受到请求后,根据请求内容来返回响应,如下图所示:

请求对象

在视图函数中,接收了request参数,通过该参数获取到URL路径,请求方式,请求参数,会话,上传文件信息等等,这里我们主要讲解获取请求参数,会话、文件信息会有单独的文章讲解,获取GET请求和POST请求参数一样,这里讲解获取GET请求参数,示例代码如下:

### views.py文件
from django.http import HttpResponse
def Get_Request(request):print(request.GET)      # 获取GET请求的参数return HttpResponse('OK')### urls.py文件
from Product.views import *
from django.urls import path
urlpatterns = [path('admin/', admin.site.urls),path('Get_Request/',Get_Request)
]

启动程序并访问http://127.0.0.1:5000/Get_Request/和http://127.0.0.1:5000/Get_Request?name=lisi,后端打印结果为:

<QueryDict: {}>
<QueryDict: {'name': ['lisi']}>

GET方法返回的是QueryDict类字典对象,获取QueryDict类字典对象里面数据的方法如下:

print(request.GET.get('name',default='张三'))  # 方法一
print(request.GET['name'])   # 方法二

在方法一中,当get获取的name不存在时,返回default设置的默认值(张三),这里我们建立使用方法一,因为在方法二中,当name不存在时,程序会报错。

访问http://127.0.0.1:5000/Get_Request?name=lisi&name=zhangsan,后端打印结果为:

<QueryDict: {'name': ['lisi', 'zhangsan']}>
zhangsan
zhangsan

当请求出现了两个name参数时,get只会返回最后一个name,当请求参数有几个相同的键时,可以通过getlist方法获取name的所有数据并返回为列表,示例代码如下:

print(request.GET.getlist('name')) 

后端打印结果为:

['lisi', 'zhangsan']

获取请求方式、URL路径、cookie、session、上传文件信息,示例代码如下:

print(request.method)       # 获取请求方式
print(request.path)     # url路径
print(request.get_full_path())      # url完整路径
print(request.COOKIES)      # COOKIES会话技术
print(request.session)      # session会话技术
print(request.FILES)        # 上传文件,前端上传的文件对象

访问http://127.0.0.1:5000/Get_Request/?name=lisi,后端打印结果如下:

GET
/Get_Request/
/Get_Request/?name=lisi
{'csrftoken': 'j86YmXNrJzEqAmtuBwfKV2KnoxlCX6JQ'}
<django.contrib.sessions.backends.db.SessionStore object at 0x00000243ACF3E260>
<MultiValueDict: {}>

响应对象

视图函数的响应主要有四种类型,分别为返回字符串(HttpResponse),返回模版(render),重定向(redirect或HttpResponseRedirect)和返回JSON(JsonResponse)。

HttpResponse

返回字符串主要使用HttpResponse方法,示例代码如下:

## views.py文件
from django.http import HttpResponse
def return_HttpResponse(request)return HttpResponse('return_HttpResponse')## urls.py文件
from django.contrib import admin
from django.urls import path
from Product.views import *urlpatterns = [path('admin/', admin.site.urls),path('return_HttpResponse/',return_HttpResponse),
]

访问http://127.0.0.1:5000/return_HttpResponse,浏览器显示return_HttpResponse。返回字符串简单了解一下就行,在开发中很少用到。

render

返回模版主要使用render方法,在使用render方法返回模版时,可以根据需求,将数据传递给模版,示例代码如下:

## views.py文件
from django.shortcuts import render
def return_render(request)content='你好'return render(request,'Hello World.html',{ 'content':content })## urls.py文件
from django.contrib import admin
from django.urls import path
from Product.views import *urlpatterns = [path('admin/', admin.site.urls),path('return_render/',return_render),
]

在Product文件夹创建templates文件夹并创建Hello World.html文件,该文件内容如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>{{ content }}</h1>
</body>
</html>

访问http://127.0.0.1:5000/return_render,浏览器显示你好。返回模版主要应用在前后端不分离的情况。

redirect或HttpResponseRedirect

重定向主要使用redirect或HttpResponseRedirect,两者没多大区别,示例代码如下:

## views.py文件
from django.shortcuts import redirect
def return_redirect(request)return redirect('/return_HttpResponse/')  # return HttpResponseRedirect('/return_HttpResponse/')## urls.py文件
from django.contrib import admin
from django.urls import path
from Product.views import *urlpatterns = [path('admin/', admin.site.urls),path('return_HttpResponse/',return_HttpResponse),path('return_redirect/',return_redirect),
]

访问http://127.0.0.1:5000/return_redirect,就会重定向return_HttpResponse/路由中,浏览器显示return_HttpResponse路由的内容(return_HttpResponse)。

注意:在重定向的URL路径中,前后都需要写斜杠。

JsonResponse

返回JSON类型数据,主要用JsonResponse方法,示例代码如下:

## views.py文件
from django.http import JsonResponse
def return_JsonResponse(request)return JsonResponse({'data':'JsonResponse'})  ## urls.py文件
from django.contrib import admin
from django.urls import path
from Product.views import *urlpatterns = [path('admin/', admin.site.urls),path('return_JsonResponse/',return_JsonResponse),
]

访问http://127.0.0.1:5000/return_JsonResponse/,浏览器显示{"data": "JsonResponse"},返回JSON主要用于前后端分离的情况。

好了,Django框架——请求与响应就学习到这里,下篇文章我们学习Django框架——路由。

公众号:白巧克力LIN

该公众号发布Python、数据库、Linux、Flask、Django、自动化测试、Git、算法、前端、服务器等相关文章!

- END -

http://www.lryc.cn/news/311580.html

相关文章:

  • rearrangement-challenge-2022环境使用学习(一)
  • [Uniapp]携带参数跳转界面(两种方法)
  • Scrapy与分布式开发(2.1.2):python常用网络请求库httpx
  • 07. Nginx进阶-Nginx负载均衡
  • windows/linux下其他位置调用指定nodejs脚本报错Error: Cannot find module ‘esm’
  • 2024-03-05 linux 分区老显示满,Use 100%,原因是SquashFS 是一种只读文件系统,它在创建时就已经被填满,所有空间都被使用。
  • 蓝桥杯倒计时 41天 - KMP 算法
  • 《汇编语言》- 读书笔记 - 第13章-int 指令
  • 深入了解 Golang 条件语句:if、else、else if 和嵌套 if 的实用示例
  • 大数据和机器学习在气象预报中的应用-张平文院士
  • C#高级:Winform桌面开发中DataGridView的详解
  • java八股文复习-----2024/03/05----基础---反射,动态代理。序列化
  • 【人工智能】Anthropic发布强大的Claude3对齐GPT-4,大模型杂谈个人感想
  • 基于openKylin与RISC-V的MindSpore AI项目实践
  • 【牛客】VL64 时钟切换
  • Java设计模式——桥连模式
  • 数据结构与算法:堆排序和TOP-K问题
  • 【NR 定位】3GPP NR Positioning 5G定位标准解读(三)
  • 文件操作与IO(3) 文件内容的读写——数据流
  • 《PyTorch深度学习实践》第十一讲卷积神经网络进阶
  • Ansible的playbook的编写和解析
  • [环境配置]ssh连接报错“kex_exchange_identification: read: Connection reset by peer”
  • Mybatis-Plus——04,自动填充时间(新注解)
  • 【动态规划入门】最长上升子序列
  • LabVIEW眼结膜微血管采集管理系统
  • 通过GitHub探索Python爬虫技术
  • 【Python】-----基础知识
  • 如何学习、上手点云算法(二):点云处理相关开源算法库、软件、工具
  • 为什么会对猫毛过敏?如何缓解?浮毛克星—宠物空气净化器推荐
  • Linux学习-etcdctl安装