目录
6. json() 将 序列化的 JSON 内容 进行反序列化
1.Error: future feature annotations is not defined
Requests 是一个 Python HTTP 库。
一、发送HTTP请求
最常用的HTTP请求是get、post。
还有put、delete、head、options。下面只介绍最常用的get、post请求。
(一)发送GET请求
1. 普通写法
response_obj = requests.get('http://www.XXX.com')
2. 带参写法(url后面带有参数)
采用字典参数的形式传入 params 栏位。
get方法里的两个位置:分别对应url路由、params参数。
data = {'name': '萝卜干', 'age': 24}
response_obj = requests.get('http://www.XXX.com', params=data)
# 最后路由和参数会组合成:http://www.XXX.com?name=萝卜干&age=24
3. 带参写法2 (参数里有列表形式)
data = {'name': '萝卜干', 'interests': [ 'programme', 'travel' ]}
response_obj = requests.get('http://www.XXX.com', params=data)
# 最后路由和参数会组合成:http://www.XXX.com?name=萝卜干&interests=programme&interests=travel
(二)发送POST请求
一种写法
采用字典参数的形式传入 data 栏位。
post方法里分别存放url路由、data参数。
data = {'name': '萝卜干', 'age': 24}
response_obj = requests.post('http://www.XXX.com', data=data)
(三)其他HTTP请求
1. 除了GET、POST请求,还有PUT、PATCH、DELETE。
PUT是批量更新,PATCH只是更新部分数据。
2. “ORM的CRUD”与“HTTP请求”的对应关系:
Create(C) = POST 建立数据
Retrieve(R) = GET 取得数据
Update(U) = PUT 完全变更、PATCH 部分修改
Delete(D) = DELETE 刪除
(四)Django自带的HTTP请求
1. 在传统的Django设计模式中,只有GET、POST(除非搭配REST framework)。
2. 所有的CUD都必须写在POST里实现业务逻辑。
3. 如果在类视图里,则CRUD都必须要在POST里完成。
4.Django的POST和GET区别
(1)POST
有querystring和body,处理业务逻辑
(2)GET
只有querystring,查询获取资源
二、获取响应信息
1. 自身验证是否正常响应
response_obj = requests.post('http://www.XXX.com', data= {'name': '萝卜干', 'age': 24} )
getres = 'response success' if response_obj else 'response fail'
注意:只是判断是否有正常响应,但不会验证状态码是否为200。
比如,若状态码是304,而不是200,其类似于假值False。虽然response自身为真值True,但只是代表有正常响应。若想根据304的具体警告信息给前端,则不能用自身来判断。
2. status_code:服务器返回的状态码
可以用状态码来做不同结果的逻辑处理。
print(response_obj.status_code) # 200
参考另一篇文章: Backend - HTTP 状态码_是萝卜干呀的博客-CSDN博客
3. content 返回b''包裹的原始字节
print(response_obj.content) # b'{"result": true, "authorData": [{"id": 1, "name": "小红", "age": 22}, {"id": 1, "name": "小蓝", "age": 26}]}'
4. text 将原始字节转换为字符串
print(response_obj.text) # {"result": true, "authorData": [{"id": 1, "name": "小红", "age": 22}, {"id": 1, "name": "小蓝", "age": 26}]}
5. encoding 显式设置编码
response_obj.encoding = 'utf-8'
6. json() 将 序列化的 JSON 内容 进行反序列化
作用:和 json.loads(response.text)是一样的。获取原本的对象。
即,使用 .text 获取 str 并使用json.loads() 对其进行反序列化。
# 使用
res = response_obj.json()
print(res) # <bound method Response.json of <Response [200]>>
# 返回值类型是字典,使用键值对的方式访问对象中的值。
res = response_obj.json().get('authorData')
参考另一篇文章: Backend - Python 序列化-CSDN博客
7 .headers 响应头部
返回类似字典的对象,可以用键来获取头部.headers中的值。
其中,HTTP规范定义头部不区分大小写。
response_obj.headers # {'Server': 'WSGIServer/0.2 CPython/3.11.4', 'Content-Type': 'application/json'}
# 例如:
response_obj.headers['Content-Type'] # 'application/json' # content首字母大写
response_obj.headers['content-type'] # 'application/json' # content字母都小写
8. url 路由
response_obj.url #http://www.XXX.com?name=萝卜干&age=24
9. timeout 超时控制
response_obj = requests.get('http://www.XXX.com', timeout=3) # 等待响应3秒
response_obj = requests.get('http://www.XXX.com', timeout=3.5) # 等待响应3.5秒 可以浮点值
三、实例应用
1. 用户执行查询(post、get)
# urls.py
from django.urls import path
from django.contrib.auth.decorators import login_required
urlpatterns = [
# get book name
path('url_book_api/', login_required(views.get_book_api.as_view()), name='url_book_api'),
]
# views.py
from django.views import View
import requests
from django.http import JsonResponse
class get_book_api(View):
def get(self, request):
# post方式
response_obj = requests.post('http://XX.XXX.X.X:8001/oracle/url_book_api/', json={'bookid': 'book1'}, headers=request.headers)
print('status_code: ', response_obj.status_code)
if response_obj.status_code == 200:
print('data: ', response_obj.json()['res'])
# get 方式
response_obj = requests.get('http://XX.XXX.X.X:8001/oracle/url_book_api/', {'bookid': 'book2'}, headers=request.headers)
if response_obj.status_code == 200:
print('data: ', response_obj.json()['res'])
return JsonResponse()
2. book 数据返回项目(返回用户查询的数据)
# urls.py
from django.urls import path
from books_views import views
urlpatterns = [
path('url_book_api/', views.book_api.as_view(), name='url_book_api', ),
]
# views.py
from django.views import View
import requests
from django.http import JsonResponse
class book_api(View):
def __init__(self):
self.books = {'book1': 'BookGet', 'book2': 'BookPost'}
def get(self, req):
bookid = req.GET.get('bookid')
rtn_msg = '书名是{}'.format(self.books[bookid])
return JsonResponse({'res': rtn_msg})
def post(self, req):
bookid = json.loads(req.body).get('bookid')
# 或者
bookid2 = req.POST.get('bookid')
rtn_msg = '书名是{}'.format(self.books[bookid])
return JsonResponse({'res': rtn_msg})
四、依赖导入问题
1.Error: future feature annotations is not defined
File "D:\XXX\myapp\views\views_book.py", line 1, in <module>.
import requests. File "d:\XXX\mypro\venv368\lib\site-packages\requests-2.31.0-py3.6.egg\requests\__init__.py", line 43, in <module>.
import urllib3.
File "d:\XXX\mypro\venv368\lib\site-packages\urllib3-2.1.0-py3.6.egg\urllib3\__init__.py", line 5.
from __future__ import annotations.
SyntaxError: future feature annotations is not defined.
原因:
python3.6 不能适配 当前的 requests 依赖版本
解决:
requests:2.31.0 降低成2.27.1
urllib3: 2.1.0 降低成1.26.18
charset-normalizer:3.3.2 降低成2.0.0