[Python]Django请求与响应

简介: [Python]Django请求与响应

66fe86357cfd482485980d3f78c6f442.jpg

前言

系列文章目录

[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('键',默认值)
• 1
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()方法。



相关文章
|
11天前
|
JSON API 数据格式
Python 请求微店商品详情数据 API 接口
微店开放平台允许开发者通过API获取商品详情数据。使用Python请求微店商品详情API的主要步骤包括:1. 注册并申请API权限,获得app_key和app_secret;2. 确定API接口地址与请求参数,如商品ID;3. 生成签名确保请求安全合法;4. 使用requests库发送HTTP请求获取数据;5. 处理返回的JSON格式响应数据。开发时需严格遵循微店API文档要求。
|
3月前
|
存储 应用服务中间件 开发工具
对象存储OSS-Python设置代理访问请求
通过 Python SDK 配置 nginx 代理地址请求阿里云 OSS 存储桶服务。示例代码展示了如何使用 RAM 账号进行身份验证,并通过代理下载指定对象到本地文件。
132 15
|
4月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
323 45
|
3月前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
92 3
|
3月前
|
JSON 前端开发 JavaScript
Python中如何判断是否为AJAX请求
AJAX请求是Web开发中常见的异步数据交互方式,允许不重新加载页面即与服务器通信。在Python的Django和Flask框架中,判断AJAX请求可通过检查请求头中的`X-Requested-With`字段实现。Django提供`request.is_ajax()`方法,Flask则需手动检查该头部。本文详解这两种框架的实现方法,并附带代码示例,涵盖安全性、兼容性、调试及前端配合等内容,帮助开发者提升Web应用性能与用户体验。
64 0
|
5月前
|
数据采集 前端开发 算法
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
本文介绍了如何使用 Python 的 `requests` 库应对复杂的 HTTP 请求场景,包括 Spider Trap(蜘蛛陷阱)、SESSION 访问限制和请求频率限制。通过代理、CSS 类链接数控制、多账号切换和限流算法等技术手段,提高爬虫的稳定性和效率,增强在反爬虫环境中的生存能力。文中提供了详细的代码示例,帮助读者掌握这些高级用法。
344 1
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
|
4月前
|
JSON API 数据格式
Python中获取HTTP请求响应体的详解
本文介绍了如何使用Python的`requests`和`urllib`库发送HTTP请求并处理响应体。`requests`库简化了HTTP请求过程,适合快速开发;`urllib`库则更为底层,适用于性能要求较高的场景。文章详细演示了发送GET请求、处理JSON响应等常见操作。
96 3
|
4月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
140 2
|
4月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
82 1
|
5月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
86 4

热门文章

最新文章