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



相关文章
|
7天前
|
Linux 数据库管理 Python
CentOS7编译安装Python3.10(含OpenSSL1.1.1安装),创建虚拟环境,运行Django项目(含sqlite版本报错)
CentOS7编译安装Python3.10(含OpenSSL1.1.1安装),创建虚拟环境,运行Django项目(含sqlite版本报错)
66 4
|
4天前
|
开发框架 数据库 开发者
Web开发新境界:用Python玩转Django和Flask!
【6月更文挑战第12天】Python的Web开发框架Django和Flask各有千秋。Django是全能型框架,适合快速开发大型应用,提供ORM、模板引擎、URL路由和后台管理等全面功能。Flask则轻量级且灵活,适用于小型到中型应用,以其简单易用、高度可扩展和灵活路由著称。两者结合使用,能应对各种Web开发需求。
|
1天前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
【6月更文挑战第15天】Python的requests库简化了HTTP请求。安装后,使用`requests.get()`发送GET请求,检查`status_code`为200表示成功。类似地,`requests.post()`用于POST请求,需提供JSON数据和`Content-Type`头。
9 6
|
2天前
|
小程序 前端开发 JavaScript
计算机Python项目|django傣族节日及民间故事推广小程序
计算机Python项目|django傣族节日及民间故事推广小程序
|
2天前
|
JSON API 数据格式
如何用 Python 的 requests 库发送 JSON 数据的 POST 请求
使用 requests 库发送 JSON 数据的 POST 请求是一个非常简单且实用的操作。通过将目标 URL 和 JSON 数据传递给 requests.post 方法,你可以轻松发送请求并处理响应。本篇文章介绍了从安装 requests 库,到发送 JSON 数据的 POST 请求,再到处理响应的整个流程。希望这篇文章能帮助你更好地理解并应用这个强大的 HTTP 请求库。
|
2天前
|
前端开发 JavaScript 数据安全/隐私保护
计算机Python项目|django学生成绩管理系统
计算机Python项目|django学生成绩管理系统
|
3天前
|
Python
python做http请求
python做http请求
9 1
|
8天前
|
JSON API 数据格式
Requests库:轻松实现Python中的HTTP请求
Requests是Python的第三方HTTP库,简化了HTTP请求的发送,支持GET、POST等方法。要安装,使用`pip install requests`。Requests以其简洁API和强大功能成为网络编程首选工具,为开发者提供高效稳定的网络交互体验。
20 5
|
中间件 数据库 Python
Django-请求生命周期
Django-请求生命周期
79 0