Backend - requests 库(Python HTTP 库)

目录

一、发送HTTP请求

(一)发送GET请求

1. 普通写法

2. 带参写法(url后面带有参数)

3. 带参写法2 (参数里有列表形式)

(二)发送POST请求

一种写法

(三)其他HTTP请求

(四)Django自带的HTTP请求

二、获取响应信息

1. 自身验证是否正常响应

2. status_code:服务器返回的状态码

3. content 返回b''包裹的原始字节

4. text 将原始字节转换为字符串

5. encoding  显式设置编码

6. json() 将 序列化的 JSON 内容 进行反序列化

7  .headers  响应头部

8. url 路由

9. timeout 超时控制

三、实例应用

1. 用户执行查询(post、get)

2. book 数据返回项目(返回用户查询的数据)

四、依赖导入问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值