[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()方法。



相关文章
|
5天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之阿里函数计算中在自定义环境下用debian10运行django,用官方层的python3.9,配置好环境变量后发现自定义层的django找不到了如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
14 3
|
7天前
|
存储 搜索推荐 开发者
django-haystack,具有全文搜索功能的 Python 库!
django-haystack,具有全文搜索功能的 Python 库!
15 0
|
8天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
10 0
|
9天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
13 3
|
13天前
|
安全 前端开发 中间件
Python面试题:Django Web框架基础与进阶
【4月更文挑战第17天】本文详细梳理了Django面试中常考的基础和进阶问题,包括MTV架构、ORM、数据库迁移、视图模板、中间件、信号、表单验证、用户认证授权等,并指出易错点及规避策略。提供代码示例展示模型和视图的实现,助力开发者在面试中脱颖而出。
35 12
|
13天前
|
数据挖掘 API 数据安全/隐私保护
python请求模块requests如何添加代理ip
python请求模块requests如何添加代理ip
|
14天前
|
数据采集 监控 前端开发
使用Python打造爬虫程序之入门探秘:掌握HTTP请求,开启你的数据抓取之旅
【4月更文挑战第19天】本文介绍了爬虫技术的基本概念和用途,阐述了HTTP协议的重要性。在Python中,借助requests库可轻松发送HTTP请求,如GET和POST。文章还展示了如何设置请求头、处理cookies和session。通过学习这些基础知识,读者将能够开始网络数据抓取,为进一步的数据分析奠定基础。后续文章将探讨HTML解析、动态内容处理及反爬虫策略。
|
16天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
16天前
|
存储 数据库 数据安全/隐私保护
基于Django的Python应用——学习笔记
基于Django的Python应用——学习笔记
|
16天前
|
API 数据库 数据安全/隐私保护
基于Django的python小应用——投票
基于Django的python小应用——投票