前言
系列文章目录
视频及资料和课件
链接: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()
方法。