[Python]Django请求与响应

发布于:2022-12-03 ⋅ 阅读:(736) ⋅ 点赞:(0)

在这里插入图片描述


前言

系列文章目录
[Python]目录
视频及资料和课件
链接:https://pan.baidu.com/s/1LCv_qyWslwB-MYw56fjbDg?pwd=1234
提取码:1234



1. 向服务器传参的途径

  • 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取,根据截取的路由向数据库查询相关数据,并将查询到的数据返回给浏览器。
  • 通过在请求链接中加入查询参数向服务器传参,形如http://ip:port/index?key1=value1&key2=value2
  • 通过请求体(body)向服务器发送数据,比如表单数据、json、xml;
  • 在http报文的头(header)中加入要向服务器传递的参数。

2. 获取通过URL向服务器传递参数

服务器要想从URL中获取传递过来的参数,需要使用正则表达式对路由进行匹配。

先规定请求的URL的格式为:

# 查询指定书籍的详细信息:
http://127.0.0.1:9090/book/书籍的类别id/书籍的id
http://127.0.0.1:9090/book/category_id/book_id
# 规定category_id、book_id都为正数

2.1 使用位置参数接收URL中的参数

项目/urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('login/', include('login.urls'))
    # 由于是和书籍相关,路由最开始为book/,引导到子应用的urls.py中继续进行路由匹配
    path('book/', include(('book.urls', 'book'), namespace='book'))
]

book/urls.py:

对路由进行正则匹配需要导入使用re_path()

from django.urls import path
# 路由正则匹配
from django.urls import re_path
# 导入对应的请求处理函数
from book.views import index,detail

urlpatterns = [
    path('index/', index, name='index'),
    # 查询指定书籍的详细信息
    # 使用正则进行匹配
    # 此处回向处理函数传递三个参数,第一个参数为请求信息,
    # 第二个参数为category_id,第三个参数为book_id
    # 根据位置获取url中的参数
    re_path(r'(\d+)/(\d+)/', detail)
]


book/views.py:

注意:位置参数的位置不能错

from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse


# Create your views here.
def index(request):
    return HttpResponse('index')


# 查询指定数据的详细信息
def detail(request, category_id, book_id):
    # 处理并返回响应
    detail_content = '书籍类别为:' + category_id + ' 书籍编号为:' + book_id
    return HttpResponse(detail_content)

在这里插入图片描述
在这里插入图片描述

2.2 使用关键字参数接收URL中的参数

在正则中,可以使用?P<value1>表示为 匹配出来的字符串 参数定义的名称为value1。

匹配URL中传递的参数,推荐使用关键字参数。
注意:参数名称要保持一致

from django.urls import path
# 正则匹配路由
from django.urls import re_path
# 导入对应的请求处理函数
from book.views import index,detail

urlpatterns = [
    path('index/', index, name='index'),
    # 查询指定书籍的详细信息
    # 使用正则进行匹配
    # 匹配出 category_id=参数1  book_id=参数2
    # 此处回向处理函数传递三个参数,第一个参数为请求信息,
    # 第二个参数为关键字参数category_id= ,第三个参数为关键字参数book_id=
    re_path(r'(?P<category_id>\d+)/(?P<book_id>\d+)/', detail)
]

在这里插入图片描述

3. 获取通过查询参数向服务器传参

http://www.baidu.com/s?wd=python

# 以问号进行分隔
# 问号前的为路由
# 问号后的表示get方式传递的参数,查询参数
# ?key=value&key=value...

项目/urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', include('login.urls')),
    path('book/', include(('book.urls', 'book'), namespace='book'))
]

login/urls.py:

from django.urls import path
from login import views

urlpatterns = [
    # 在 项目名.urls中与login/匹配成功进入该模块继续进行匹配
    path('', views.login)
]

服务器可以通过request.GET得到浏览器通过查询参数传递过来的参数。

login/views.py:

from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse


# Create your views here.
def login(request):
    # 获取浏览器通过查询参数传递过来的参数
    params = request.GET
    print(params)
    return HttpResponse('收到请求')

在这里插入图片描述

3.1 Django中的QueryDict对象

HttpRequest对象的属性GET、POST都是QueryDict类型的对象。与python字典不同,QueryDict类型的对象可以用来处理同一个键带有多个值的情况。

在这里插入图片描述
在这里插入图片描述

# 采用字典的方式获取不同参数的值
def login(request):
    # 获取浏览器通过查询参数传递过来的参数
    params = request.GET
    # print(params)
    username = params['username']
    pwd = params['pwd']
    print('用户名:', username, '密码:', pwd)
    return HttpResponse('用户名:'+username+ ' 密码:'+pwd)

由结果可得,使用字典的方式获取不同参数的值,对于同一个键带有多个值的情况,只能得到最后一个值。
在这里插入图片描述

获取指定键的所有值,使用getlist()方法
getlist()方法:如果键不存在则返回空列表[],可以设置默认值进行后续处理

语法:

getlist('键',默认值)
def login(request):
    # 获取浏览器通过查询参数传递过来的参数
    params = request.GET
    username = params.getlist('username')
    pwd = params.getlist('pwd')
    print('用户名:', username, '密码:', pwd)
    return HttpResponse('收到')

在这里插入图片描述
在这里插入图片描述

4. 获取通过请求体向服务器发送数据

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

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

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

CSRF中间件后面进行介绍
未注释掉CSRF中间件
在这里插入图片描述

4.1 表单数据

服务器可以通过request.POST得到浏览器通过请求体向服务器发送的表单数据。

from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse


# Create your views here.
def login(request):
    # 通过请求体向服务器发送的表单数据
    # 返回QueryDict对象
    params = request.POST
    print(params)
    username = params.getlist('username')
    pwd = params.getlist('pwd')
    print('用户名:', username, '密码:', pwd)
    return HttpResponse('收到')

由结果可得,HttpRequest对象的属性POST是QueryDict类型的对象。客户端传递过来的数据的获取,可以使用字典方式获取不同参数的值,对于同一个键带有多个值的情况使用getlist()方法。
在这里插入图片描述
在这里插入图片描述

4.2 JSON数据

4.2.1 Postman发送JSON数据

JSON字符串必须使用双引号,JSON与字典类似

在这里插入图片描述

{
    "username":"zszs",
    "pwd":"123123"
}

4.2.2 服务器获取传递的JSON数据

服务器获取传递的JSON数据,使用request.body.

json模块:

  • json.dumps:将字典转换为JSON字符串
  • json.loads:将JSON字符串转换为字典
from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse
import json

# Create your views here.
def login(request):
    # JSON数据在request的body中
    # 获取传递的JSON数据
    body = request.body
    print(body)
    # 传递过来的数据为二进制,对传递的数据进行解码
    body_str = body.decode()
    print(body_str, type(body_str))
    # 解码后的数据为JSON字符串,转换为字典
    body_dic = json.loads(body_str)
    print(body_dic, type(body_dic))
    return HttpResponse('收到')

在这里插入图片描述
在这里插入图片描述

5. 获取请求头传递的数据

获取通过请求头传递过来的数据,使用request.MATE进行获取请求头headers中的数据,request.META为字典类型。

from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse
import json


# Create your views here.
def login(request):
    # 获取请求头
    request_header = request.META
    print(request_header)
    print(type(request_header))
    # 由于请求头是字典类型
    # 获取请求发送过来的文本的文本类
    print(request_header['CONTENT_TYPE'])
    return HttpResponse('收到')

在这里插入图片描述
在这里插入图片描述

6. 其他常用HttpRequest对象属性

  • method:一个字符串,表示请求使用的HTTP方法,常用值包括:‘GET’、‘POST’。
  • user:请求的用户对象。
  • path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
  • encoding:一个字符串,表示提交的数据的编码方式。
    • 如果为None则表示使用浏览器的默认设置,一般为utf-8。
    • 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
  • FILES:一个类似于字典的对象,包含所有的上传文件。
from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse
import json


# Create your views here.
def login(request):
    # 获取浏览器发送请求的请求类型
    print(request.method)
    # 获取所有的上传文件
    print(request.FILES)
    return HttpResponse('收到')

在这里插入图片描述

7. HttpResponse对象

视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

7.1 HttpResponse

可以使用django.http.HttpResponse来构造响应对象。

HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse
import json


# Create your views here.
def login(request):
    data = {
        'name': 'zszs'
    }
    return HttpResponse(data)

在这里插入图片描述

from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse
import json


# Create your views here.
def login(request):
    obj = object()
    return HttpResponse(obj)

在这里插入图片描述

from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse
import json


# Create your views here.
def login(request):
    return HttpResponse('收到请求')

在这里插入图片描述

7.2 JsonResponse

JsonResponse为HttpResponse的子类对象。

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

JsonResponse的作用:
1.帮助我们将数据转换为json字符串
2.设置响应头Content-Type为application/json

from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse
from django.http import JsonResponse
import json


# Create your views here.
def login(request):
    data = {
        'name': 'zszszs'
    }
    return JsonResponse(data)

在这里插入图片描述

7.3 HttpResponse的其他子类

Django提供了一系列HttpResponse的子类,可以快速设置状态码

  • HttpResponseRedirect 301
  • HttpResponsePermanentRedirect 302
  • HttpResponseNotModified 304
  • HttpResponseBadRequest 400
  • HttpResponseNotFound 404
  • HttpResponseForbidden 403
  • HttpResponseNotAllowed 405
  • HttpResponseGone 410
  • HttpResponseServerError 500

8. 重定向

在浏览器向服务器发送请求成功后,可以将页面重定向到其他的页面或网址。如:用户进行登录,登录成功后跳转到首页,可以使用重定向。

进行重定向使用redirect()

redirect()的导入:

from django.shortcuts import redirect
from django.shortcuts import render
from django.http import HttpRequest
from django.http import HttpResponse
from django.http import JsonResponse
from django.shortcuts import redirect
from django.urls import reverse
import json


# Create your views here.
def login(request):
    # 请求成功,进行页面跳转
    # 跳转到book/index
    # 由于对路由起了命名空间和路由命名
    # path('book/', include(('book.urls', 'book'), namespace='book'))
    # path('index/', index, name='index')
    # 动态获取路由
    redirect_path = reverse('book:index')
    return redirect(redirect_path)

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看