上篇文章我们学习了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 -