前言
系列文章目录
[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=状态码)
- 可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码:
- content:表示返回的内容。
- 默认传递字符串,不要传递对象、字典等数据
- content_type:响应体数据类型
- 这是一个MIME类型,语法形式:大类/小类,
- 常见的响应体数据类型,text/html、text/css、text/javascript、application/json、image/png、image/gif、image/jpeg。
- MIME类型参考手册:https://www.runoob.com/http/mime-types.html、https://www.w3school.com.cn/media/media_mimeref.asp
- status:返回的HTTP响应状态码。
- 响应状态码必须要在100到599之间。
- 只能使用系统规定的。
- 响应状态码参考手册:https://www.runoob.com/http/http-status-codes.html、https://seo.juziseo.com/doc/http_code/
- content:表示返回的内容。
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)