Yêu cầu Python chấp nhận cookie

Đối tượng Phiên cho phép bạn duy trì các tham số nhất định trong các yêu cầu. Nó cũng duy trì cookie trên tất cả các yêu cầu được thực hiện từ phiên bản Phiên và sẽ sử dụng của

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
6. Vì vậy, nếu bạn đang thực hiện một số yêu cầu đối với cùng một máy chủ, kết nối TCP bên dưới sẽ được sử dụng lại, điều này có thể dẫn đến hiệu suất tăng đáng kể [xem kết nối liên tục HTTP]

Một đối tượng Phiên có tất cả các phương thức của API Yêu cầu chính

Hãy duy trì một số cookie theo yêu cầu

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'

Phiên cũng có thể được sử dụng để cung cấp dữ liệu mặc định cho các phương thức yêu cầu. Điều này được thực hiện bằng cách cung cấp dữ liệu cho các thuộc tính trên đối tượng Phiên

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]

Bất kỳ từ điển nào bạn chuyển đến một phương thức yêu cầu sẽ được hợp nhất với các giá trị cấp phiên được đặt. Các tham số cấp phương thức ghi đè các tham số phiên

Tuy nhiên, xin lưu ý rằng các tham số cấp phương thức sẽ không được duy trì trong các yêu cầu, ngay cả khi sử dụng phiên. Ví dụ này sẽ chỉ gửi cookie với yêu cầu đầu tiên chứ không phải yêu cầu thứ hai

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'

Nếu bạn muốn thêm cookie vào phiên của mình theo cách thủ công, hãy sử dụng để thao tác

Phiên cũng có thể được sử dụng làm trình quản lý ngữ cảnh

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']

Điều này sẽ đảm bảo phiên được đóng ngay khi khối

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
8 được thoát, ngay cả khi xảy ra các trường hợp ngoại lệ chưa được xử lý

Xóa giá trị khỏi tham số Dict

Đôi khi, bạn sẽ muốn bỏ qua các khóa cấp phiên khỏi tham số dict. Để làm điều này, bạn chỉ cần đặt giá trị của khóa đó thành

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
9 trong tham số cấp độ phương thức. Nó sẽ tự động bị bỏ qua

Tất cả các giá trị có trong một phiên đều có sẵn trực tiếp cho bạn. Xem để tìm hiểu thêm

Đối tượng yêu cầu và phản hồi

Bất cứ khi nào có cuộc gọi tới

from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]
0 và bạn bè, bạn đang làm hai việc chính. Đầu tiên, bạn đang xây dựng một đối tượng
from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]
1 sẽ được gửi đến máy chủ để yêu cầu hoặc truy vấn một số tài nguyên. Thứ hai, một đối tượng
from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]
2 được tạo sau khi Yêu cầu nhận được phản hồi từ máy chủ. Đối tượng
from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]
2 chứa tất cả thông tin do máy chủ trả về và cũng chứa đối tượng
from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]
1 mà bạn đã tạo ban đầu. Đây là một yêu cầu đơn giản để lấy một số thông tin rất quan trọng từ các máy chủ của Wikipedia

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
2

Nếu chúng tôi muốn truy cập các tiêu đề mà máy chủ đã gửi lại cho chúng tôi, chúng tôi sẽ làm điều này

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
3

Tuy nhiên, nếu chúng tôi muốn lấy các tiêu đề mà chúng tôi đã gửi cho máy chủ, chúng tôi chỉ cần truy cập vào yêu cầu và sau đó là các tiêu đề của yêu cầu

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}

Yêu cầu đã chuẩn bị

Bất cứ khi nào bạn nhận được một đối tượng từ lệnh gọi API hoặc lệnh gọi Phiên, thuộc tính

from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]
6 thực sự là
from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]
7 đã được sử dụng. Trong một số trường hợp, bạn có thể muốn thực hiện thêm một số công việc đối với nội dung hoặc tiêu đề [hoặc bất kỳ thứ gì khác thực sự] trước khi gửi yêu cầu. Công thức đơn giản cho món này như sau

from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]

Vì bạn không làm gì đặc biệt với đối tượng

from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]
1, bạn chuẩn bị nó ngay lập tức và sửa đổi đối tượng
from requests import Request, Session

s = Session[]

req = Request['POST', url, data=data, headers=headers]
prepped = req.prepare[]

# do something with prepped.body
prepped.body = 'No, I want exactly this as the body.'

# do something with prepped.headers
del prepped.headers['Content-Type']

resp = s.send[prepped,
    stream=stream,
    verify=verify,
    proxies=proxies,
    cert=cert,
    timeout=timeout
]

print[resp.status_code]
7. Sau đó, bạn gửi nó cùng với các thông số khác mà lẽ ra bạn đã gửi đến
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
00 hoặc
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
01

Tuy nhiên, đoạn mã trên sẽ làm mất đi một số ưu điểm khi có đối tượng Requests. Đặc biệt, trạng thái -level chẳng hạn như cookie sẽ không được áp dụng cho yêu cầu của bạn. Để áp dụng trạng thái with đó, hãy thay thế cuộc gọi đến bằng cuộc gọi đến , như thế này

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
0

Khi bạn đang sử dụng luồng yêu cầu đã chuẩn bị, hãy nhớ rằng luồng này không tính đến môi trường. Điều này có thể gây ra sự cố nếu bạn đang sử dụng biến môi trường để thay đổi hành vi của yêu cầu. Ví dụ. Chứng chỉ SSL tự ký được chỉ định trong

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
07 sẽ không được tính đến. Kết quả là một
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
08 bị ném. Bạn có thể khắc phục hành vi này bằng cách hợp nhất rõ ràng cài đặt môi trường vào phiên của mình

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
5

Xác minh chứng chỉ SSL

Yêu cầu xác minh chứng chỉ SSL cho yêu cầu HTTPS, giống như trình duyệt web. Theo mặc định, xác minh SSL được bật và Yêu cầu sẽ đưa ra lỗi SSLError nếu không thể xác minh chứng chỉ

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
0

Tôi không thiết lập SSL trên miền này, vì vậy nó sẽ tạo ra một ngoại lệ. Xuất sắc. GitHub cũng vậy

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
1

Bạn có thể chuyển

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
09 đường dẫn đến tệp hoặc thư mục CA_BUNDLE có chứng chỉ của các CA đáng tin cậy

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
2

hay dai dẳng

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
3

Ghi chú

Nếu

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
09 được đặt thành đường dẫn đến một thư mục, thì thư mục đó phải được xử lý bằng tiện ích
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
51 được cung cấp cùng với OpenSSL

Danh sách các CA đáng tin cậy này cũng có thể được chỉ định thông qua biến môi trường

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
07. Nếu
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
07 không được đặt, thì
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
54 sẽ được sử dụng làm dự phòng

Các yêu cầu cũng có thể bỏ qua việc xác minh chứng chỉ SSL nếu bạn đặt

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
09 thành Sai

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
4

Lưu ý rằng khi

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
09 được đặt thành
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
57, các yêu cầu sẽ chấp nhận bất kỳ chứng chỉ TLS nào do máy chủ cung cấp và sẽ bỏ qua các tên máy chủ không khớp và/hoặc chứng chỉ hết hạn, điều này sẽ khiến ứng dụng của bạn dễ bị tấn công bởi người trung gian [MitM]. Đặt xác minh thành
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
57 có thể hữu ích trong quá trình phát triển hoặc thử nghiệm cục bộ

Theo mặc định,

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
09 được đặt thành True. Tùy chọn
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
09 chỉ áp dụng cho các chứng chỉ lưu trữ

Chứng chỉ phía máy khách

Bạn cũng có thể chỉ định một chứng chỉ cục bộ để sử dụng làm chứng chỉ phía máy khách, dưới dạng một tệp [chứa khóa riêng và chứng chỉ] hoặc dưới dạng một bộ đường dẫn của cả hai tệp

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
5

hay dai dẳng

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
6

Nếu bạn chỉ định sai đường dẫn hoặc chứng chỉ không hợp lệ, bạn sẽ nhận được SSLError

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
7

Cảnh báo

Khóa riêng cho chứng chỉ cục bộ của bạn phải không được mã hóa. Hiện tại, Yêu cầu không hỗ trợ sử dụng khóa được mã hóa

Chứng chỉ CA

Yêu cầu sử dụng chứng chỉ từ gói certifi. Điều này cho phép người dùng cập nhật chứng chỉ đáng tin cậy của họ mà không thay đổi phiên bản Yêu cầu

Trước phiên bản 2. 16, Các yêu cầu bao gồm một tập hợp các CA gốc mà nó tin cậy, có nguồn gốc từ cửa hàng tin cậy Mozilla. Các chứng chỉ chỉ được cập nhật một lần cho mỗi phiên bản Yêu cầu. Khi

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
01 không được cài đặt, điều này dẫn đến các gói chứng chỉ cực kỳ lỗi thời khi sử dụng các phiên bản Yêu cầu cũ hơn đáng kể

Vì mục đích bảo mật, chúng tôi khuyên bạn nên nâng cấp chứng chỉ thường xuyên

Quy trình công việc nội dung cơ thể

Theo mặc định, khi bạn đưa ra yêu cầu, nội dung của phản hồi sẽ được tải xuống ngay lập tức. Bạn có thể ghi đè hành vi này và hoãn tải xuống nội dung phản hồi cho đến khi bạn truy cập vào thuộc tính có tham số

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
03

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
8

Tại thời điểm này, chỉ các tiêu đề phản hồi đã được tải xuống và kết nối vẫn mở, do đó cho phép chúng tôi đặt điều kiện truy xuất nội dung

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
9

Bạn có thể kiểm soát thêm quy trình công việc bằng cách sử dụng các phương thức và. Ngoài ra, bạn có thể đọc nội dung chưa giải mã từ urllib3 cơ bản tại

Nếu bạn đặt

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
03 thành
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
09 khi thực hiện yêu cầu, Yêu cầu không thể giải phóng kết nối trở lại nhóm trừ khi bạn sử dụng tất cả dữ liệu hoặc gọi. Điều này có thể dẫn đến sự kém hiệu quả với các kết nối. Nếu bạn thấy mình chỉ đọc một phần nội dung yêu cầu [hoặc hoàn toàn không đọc] trong khi sử dụng
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
11, bạn nên đưa ra yêu cầu trong câu lệnh
>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
8 để đảm bảo nó luôn đóng

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
0

Cố sống đi

Tin tuyệt vời — nhờ có urllib3, tính năng duy trì hoạt động là tự động 100% trong một phiên. Mọi yêu cầu bạn thực hiện trong một phiên sẽ tự động sử dụng lại kết nối thích hợp

Lưu ý rằng các kết nối chỉ được giải phóng trở lại nhóm để sử dụng lại sau khi tất cả dữ liệu cơ thể đã được đọc;

Tải lên trực tuyến

Yêu cầu hỗ trợ tải lên trực tuyến, cho phép bạn gửi các luồng hoặc tệp lớn mà không cần đọc chúng vào bộ nhớ. Để phát trực tuyến và tải lên, chỉ cần cung cấp một đối tượng giống như tệp cho nội dung của bạn

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
1

Cảnh báo

Chúng tôi thực sự khuyên bạn nên mở các tệp trong. Điều này là do Yêu cầu có thể cố gắng cung cấp tiêu đề

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
17 cho bạn và nếu có, giá trị này sẽ được đặt thành số byte trong tệp. Lỗi có thể xảy ra nếu bạn mở tệp ở chế độ văn bản

Chunk-Encoded Requests

Các yêu cầu cũng hỗ trợ mã hóa chuyển Chunked cho các yêu cầu gửi đi và gửi đến. Để gửi yêu cầu được mã hóa đoạn, chỉ cần cung cấp trình tạo [hoặc bất kỳ trình lặp nào không có độ dài] cho phần thân của bạn

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
2

Đối với các phản hồi được mã hóa theo đoạn, tốt nhất là lặp lại dữ liệu bằng cách sử dụng. Trong một tình huống lý tưởng, bạn sẽ đặt

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
11 theo yêu cầu, trong trường hợp đó, bạn có thể lặp lại từng đoạn bằng cách gọi
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
20 với tham số
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
21 là
>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
9. Nếu bạn muốn đặt kích thước tối đa của đoạn, bạn có thể đặt tham số
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
21 thành bất kỳ số nguyên nào

POST nhiều tệp được mã hóa nhiều phần

Bạn có thể gửi nhiều tệp trong một yêu cầu. Ví dụ: giả sử bạn muốn tải tệp hình ảnh lên biểu mẫu HTML có nhiều trường tệp 'hình ảnh'

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
3

Để làm điều đó, chỉ cần đặt các tệp thành danh sách các bộ của

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
24

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
4

Cảnh báo

Chúng tôi thực sự khuyên bạn nên mở các tệp trong. Điều này là do Yêu cầu có thể cố gắng cung cấp tiêu đề

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
17 cho bạn và nếu có, giá trị này sẽ được đặt thành số byte trong tệp. Lỗi có thể xảy ra nếu bạn mở tệp ở chế độ văn bản

móc sự kiện

Yêu cầu có một hệ thống hook mà bạn có thể sử dụng để thao tác các phần của quy trình yêu cầu hoặc xử lý sự kiện báo hiệu

móc có sẵn

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
26

Phản hồi được tạo từ Yêu cầu

Bạn có thể chỉ định một hàm hook trên cơ sở mỗi yêu cầu bằng cách chuyển từ điển

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
27 cho tham số yêu cầu
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
28

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
5

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
29 đó sẽ nhận được một đoạn dữ liệu làm đối số đầu tiên của nó

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
6

Hàm gọi lại của bạn phải xử lý các ngoại lệ của chính nó. Mọi ngoại lệ chưa được xử lý sẽ không được thông qua một cách im lặng và do đó sẽ được xử lý bằng mã gọi Yêu cầu

Nếu hàm gọi lại trả về một giá trị, giả định rằng nó sẽ thay thế dữ liệu được truyền vào. Nếu chức năng không trả về bất cứ điều gì, không có gì khác bị ảnh hưởng

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
7

Hãy in một số đối số phương thức yêu cầu trong thời gian chạy

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
8

Bạn có thể thêm nhiều hook vào một yêu cầu. Hãy gọi hai móc cùng một lúc

s = requests.Session[]

r = s.get['//httpbin.org/cookies', cookies={'from-my': 'browser'}]
print[r.text]
# '{"cookies": {"from-my": "browser"}}'

r = s.get['//httpbin.org/cookies']
print[r.text]
# '{"cookies": {}}'
9

Bạn cũng có thể thêm hook vào phiên bản

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
02. Bất kỳ hook nào bạn thêm sau đó sẽ được gọi theo mọi yêu cầu được thực hiện cho phiên. Ví dụ

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
0

Một

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
02 có thể có nhiều móc, sẽ được gọi theo thứ tự chúng được thêm vào

Xác thực tùy chỉnh

Yêu cầu cho phép bạn chỉ định cơ chế xác thực của riêng mình

Bất kỳ khả năng gọi nào được truyền dưới dạng đối số

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
32 cho một phương thức yêu cầu sẽ có cơ hội sửa đổi yêu cầu trước khi nó được gửi đi

Việc triển khai xác thực là các lớp con của và dễ xác định. Các yêu cầu cung cấp hai triển khai lược đồ xác thực phổ biến trong

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
34. và

Hãy giả sử rằng chúng ta có một dịch vụ web sẽ chỉ phản hồi nếu tiêu đề

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
37 được đặt thành giá trị mật khẩu. Không chắc, nhưng chỉ cần đi với nó

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
1

Sau đó, chúng tôi có thể đưa ra yêu cầu bằng cách sử dụng Pizza Auth của chúng tôi

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
2

Yêu cầu phát trực tuyến

Với bạn, bạn có thể dễ dàng lặp lại các API phát trực tuyến, chẳng hạn như API phát trực tuyến Twitter. Chỉ cần đặt

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
03 thành
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
09 và lặp lại phản hồi với

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
3

Khi sử dụng decode_unicode=True với hoặc , bạn sẽ muốn cung cấp mã hóa dự phòng trong trường hợp máy chủ không cung cấp mã hóa dự phòng

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
4

Cảnh báo

không phải là reentrant an toàn. Gọi phương thức này nhiều lần khiến một số dữ liệu nhận được bị mất. Trong trường hợp bạn cần gọi nó từ nhiều nơi, thay vào đó hãy sử dụng đối tượng trình vòng lặp kết quả

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
5

proxy

Nếu cần sử dụng proxy, bạn có thể định cấu hình các yêu cầu riêng lẻ bằng đối số

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
45 cho bất kỳ phương thức yêu cầu nào

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
6

Ngoài ra, bạn có thể định cấu hình một lần cho toàn bộ

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
7

Cảnh báo

Cài đặt

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
47 có thể hoạt động khác với dự kiến. Các giá trị được cung cấp sẽ bị ghi đè bởi các proxy môi trường [những giá trị được trả về bởi ]. Để đảm bảo việc sử dụng proxy khi có proxy môi trường, hãy chỉ định rõ ràng đối số
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
45 trên tất cả các yêu cầu riêng lẻ như đã giải thích ban đầu ở trên

Xem #2018 để biết chi tiết

Khi cấu hình proxy không bị ghi đè theo yêu cầu như được hiển thị ở trên, Yêu cầu dựa trên cấu hình proxy được xác định bởi các biến môi trường tiêu chuẩn

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
49,
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
50,
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
51 và
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
52. Các biến thể chữ hoa của các biến này cũng được hỗ trợ. Do đó, bạn có thể đặt chúng để định cấu hình Yêu cầu [chỉ đặt những yêu cầu phù hợp với nhu cầu của bạn]

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
8

Để sử dụng HTTP Basic Auth với proxy của bạn, hãy sử dụng http. //người sử dụng. cú pháp password@host/ trong bất kỳ mục cấu hình nào ở trên

with requests.Session[] as s:
    s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
9

Cảnh báo

Lưu trữ thông tin tên người dùng và mật khẩu nhạy cảm trong một biến môi trường hoặc tệp được kiểm soát theo phiên bản là một rủi ro bảo mật và rất không được khuyến khích

Để cung cấp proxy cho một lược đồ và máy chủ lưu trữ cụ thể, hãy sử dụng lược đồ. // hình thức tên máy chủ cho khóa. Điều này sẽ phù hợp với bất kỳ yêu cầu nào đối với lược đồ đã cho và tên máy chủ chính xác

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
20

Lưu ý rằng các URL proxy phải bao gồm lược đồ

Cuối cùng, lưu ý rằng việc sử dụng proxy cho các kết nối https thường yêu cầu máy cục bộ của bạn tin cậy chứng chỉ gốc của proxy. Theo mặc định, có thể tìm thấy danh sách các chứng chỉ được Yêu cầu tin cậy với

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
21

Bạn ghi đè gói chứng chỉ mặc định này bằng cách đặt biến môi trường

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
07 [hoặc
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
54] thành một đường dẫn tệp khác

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
22

Vớ

Mới trong phiên bản 2. 10. 0

Ngoài các proxy HTTP cơ bản, Yêu cầu cũng hỗ trợ các proxy sử dụng giao thức SOCKS. Đây là một tính năng tùy chọn yêu cầu cài đặt thêm thư viện của bên thứ ba trước khi sử dụng

Bạn có thể lấy các phụ thuộc cho tính năng này từ

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
55

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
23

Sau khi bạn đã cài đặt các phần phụ thuộc đó, việc sử dụng proxy SOCKS cũng dễ dàng như sử dụng HTTP

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
24

Sử dụng lược đồ

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
56 khiến quá trình phân giải DNS diễn ra trên máy khách, thay vì trên máy chủ proxy. Điều này phù hợp với curl, sử dụng lược đồ để quyết định thực hiện phân giải DNS trên máy khách hay proxy. Nếu bạn muốn phân giải các miền trên máy chủ proxy, hãy sử dụng
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
57 làm sơ đồ

Tuân thủ

Các yêu cầu nhằm mục đích tuân thủ tất cả các thông số kỹ thuật và RFC có liên quan khi việc tuân thủ đó sẽ không gây khó khăn cho người dùng. Việc chú ý đến đặc tả này có thể dẫn đến một số hành vi có vẻ bất thường đối với những người không quen thuộc với đặc tả có liên quan

mã hóa

Khi bạn nhận được phản hồi, Yêu cầu sẽ đoán mã hóa để sử dụng để giải mã phản hồi khi bạn truy cập thuộc tính. Trước tiên, các yêu cầu sẽ kiểm tra mã hóa trong tiêu đề HTTP và nếu không có mã hóa nào, sẽ sử dụng charset_normalizer hoặc chardet để cố gắng đoán mã hóa

Nếu

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
59 được cài đặt, thì
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
60 sẽ sử dụng nó, tuy nhiên đối với python3 thì
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
59 không còn là phụ thuộc bắt buộc nữa. Thư viện
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
59 là phần phụ thuộc được cấp phép LGPL và một số người dùng yêu cầu không thể phụ thuộc vào phần phụ thuộc bắt buộc được cấp phép LGPL

Khi bạn cài đặt

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
60 mà không chỉ định thêm
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
64 và
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
59 chưa được cài đặt,
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
60 sẽ sử dụng
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
67 [được cấp phép bởi MIT] để đoán mã hóa

Lần duy nhất Yêu cầu sẽ không đoán mã hóa là nếu không có bộ ký tự rõ ràng trong tiêu đề HTTP và tiêu đề

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
68 chứa
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
69. Trong tình huống này, chỉ định rằng bộ ký tự mặc định phải là
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
70. Yêu cầu tuân theo đặc điểm kỹ thuật trong trường hợp này. Nếu bạn yêu cầu mã hóa khác, bạn có thể đặt thuộc tính theo cách thủ công hoặc sử dụng mã thô

Động từ HTTP

Yêu cầu cung cấp quyền truy cập vào gần như đầy đủ các động từ HTTP. NHẬN, TÙY CHỌN, ĐẦU, ĐĂNG, ĐẶT, VÁ và XÓA. Phần sau đây cung cấp các ví dụ chi tiết về cách sử dụng các động từ khác nhau này trong Yêu cầu, sử dụng API GitHub

Chúng ta sẽ bắt đầu với động từ được sử dụng phổ biến nhất. LẤY. HTTP GET là một phương thức bình thường trả về tài nguyên từ một URL nhất định. Do đó, đây là động từ bạn nên sử dụng khi cố truy xuất dữ liệu từ một vị trí web. Một ví dụ sử dụng sẽ cố lấy thông tin về một cam kết cụ thể từ GitHub. Giả sử chúng tôi muốn cam kết

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
73 trên Yêu cầu. Chúng tôi sẽ nhận được nó như vậy

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
25

Chúng ta nên xác nhận rằng GitHub đã phản hồi chính xác. Nếu có, chúng tôi muốn tìm hiểu xem đó là loại nội dung gì. Làm điều này như vậy

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
26

Vì vậy, GitHub trả về JSON. Thật tuyệt, chúng ta có thể sử dụng phương thức để phân tích nó thành các đối tượng Python

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
27

Cho đến nay, rất đơn giản. Chà, hãy tìm hiểu một chút về API GitHub. Bây giờ, chúng tôi có thể xem tài liệu, nhưng chúng tôi có thể vui hơn một chút nếu sử dụng Yêu cầu thay thế. Chúng ta có thể tận dụng động từ Requests OPTIONS để xem loại phương thức HTTP nào được hỗ trợ trên url mà chúng ta vừa sử dụng

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
28

Cái gì? . Hóa ra GitHub, giống như nhiều nhà cung cấp API, không thực sự triển khai phương thức TÙY CHỌN. Đây là một sơ suất khó chịu, nhưng không sao, chúng ta có thể sử dụng tài liệu nhàm chán. Tuy nhiên, nếu GitHub đã triển khai TÙY CHỌN chính xác, họ sẽ trả về các phương thức được phép trong tiêu đề, e. g

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
29

Chuyển sang tài liệu, chúng tôi thấy rằng phương pháp duy nhất khác được phép cho các lần xác nhận là POST, phương thức này tạo ra một lần xác nhận mới. Khi chúng tôi đang sử dụng repo Yêu cầu, có lẽ chúng tôi nên tránh thực hiện các POST đối với nó. Thay vào đó, hãy chơi với tính năng Sự cố của GitHub

Tài liệu này đã được thêm vào để phản hồi Vấn đề #482. Cho rằng vấn đề này đã tồn tại, chúng tôi sẽ sử dụng nó làm ví dụ. Hãy bắt đầu bằng cách lấy nó

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
30

Thật tuyệt, chúng tôi có ba nhận xét. Chúng ta hãy nhìn vào cuối cùng của họ

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
31

Vâng, đó có vẻ như là một nơi ngớ ngẩn. Hãy đăng một bình luận nói với người đăng rằng anh ấy thật ngớ ngẩn. Ai là người đăng, dù sao?

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
32

OK, vậy hãy nói với anh chàng Kenneth này rằng chúng tôi nghĩ rằng ví dụ này nên có trong phần hướng dẫn bắt đầu nhanh thay thế. Theo tài liệu API GitHub, cách để thực hiện việc này là POST vào chuỗi. Hãy làm nó

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
33

Hừ, lạ nhỉ. Có lẽ chúng ta cần phải xác thực. Đó sẽ là một nỗi đau, phải không? . Yêu cầu giúp dễ dàng sử dụng nhiều hình thức xác thực, bao gồm Xác thực cơ bản rất phổ biến

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
34

Rực rỡ. Ồ, đợi đã, không. Tôi muốn nói thêm rằng tôi sẽ mất một lúc, vì tôi phải đi cho con mèo của mình ăn. Giá như tôi có thể chỉnh sửa bình luận này. Rất vui, GitHub cho phép chúng tôi sử dụng một động từ HTTP khác, PATCH, để chỉnh sửa nhận xét này. Hãy làm điều đó

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
35

Xuất sắc. Bây giờ, chỉ để tra tấn anh chàng Kenneth này, tôi đã quyết định để anh ta đổ mồ hôi và không nói với anh ta rằng tôi đang làm việc này. Điều đó có nghĩa là tôi muốn xóa bình luận này. GitHub cho phép chúng tôi xóa nhận xét bằng phương thức XÓA được đặt tên cực kỳ thông minh. Hãy thoát khỏi nó

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
36

Xuất sắc. Tất cả đi. Điều cuối cùng tôi muốn biết là tôi đã sử dụng bao nhiêu trong giới hạn tỷ lệ của mình. Hãy cùng tìm hiểu. GitHub gửi thông tin đó trong tiêu đề, vì vậy thay vì tải xuống toàn bộ trang, tôi sẽ gửi yêu cầu HEAD để lấy tiêu đề

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
37

Xuất sắc. Đã đến lúc viết một chương trình Python lạm dụng API GitHub theo mọi cách thú vị, 4995 lần nữa

động từ tùy chỉnh

Đôi khi, bạn có thể đang làm việc với một máy chủ, vì bất kỳ lý do gì, cho phép sử dụng hoặc thậm chí yêu cầu sử dụng các động từ HTTP không được đề cập ở trên. Một ví dụ về điều này sẽ là phương pháp MKCOL mà một số máy chủ WEBDAV sử dụng. Đừng băn khoăn, chúng vẫn có thể được sử dụng với Yêu cầu. Chúng sử dụng phương pháp

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
75 tích hợp. Ví dụ

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
38

Bằng cách sử dụng điều này, bạn có thể sử dụng bất kỳ động từ phương thức nào mà máy chủ của bạn cho phép

Tiêu đề liên kết

Nhiều API HTTP có tiêu đề Liên kết. Họ làm cho các API tự mô tả và dễ khám phá hơn

Ví dụ, GitHub sử dụng những thứ này trong API của họ

s = requests.Session[]

s.get['//httpbin.org/cookies/set/sessioncookie/123456789']
r = s.get['//httpbin.org/cookies']

print[r.text]
# '{"cookies": {"sessioncookie": "123456789"}}'
39

Các yêu cầu sẽ tự động phân tích cú pháp các tiêu đề liên kết này và làm cho chúng dễ dàng sử dụng được

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
0

Bộ điều hợp vận chuyển

kể từ v1. 0. 0, Yêu cầu đã chuyển sang thiết kế bên trong kiểu mô-đun. Một phần lý do điều này được thực hiện là để triển khai Bộ điều hợp truyền tải, được mô tả ban đầu tại đây. Transport Adapters cung cấp một cơ chế để xác định các phương thức tương tác cho một dịch vụ HTTP. Đặc biệt, chúng cho phép bạn áp dụng cấu hình theo từng dịch vụ

Yêu cầu vận chuyển với một Transport Adapter duy nhất,. Bộ điều hợp này cung cấp tương tác Yêu cầu mặc định với HTTP và HTTPS bằng thư viện urllib3 mạnh mẽ. Bất cứ khi nào một Yêu cầu được khởi tạo, một trong số này được gắn vào đối tượng cho HTTP và một cho HTTPS

Yêu cầu cho phép người dùng tạo và sử dụng Bộ điều hợp truyền tải của riêng họ cung cấp chức năng cụ thể. Sau khi được tạo, Bộ điều hợp truyền tải có thể được gắn vào một đối tượng Phiên, cùng với chỉ báo về dịch vụ web nào nó sẽ áp dụng cho

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
1

Cuộc gọi gắn kết đăng ký một phiên bản cụ thể của Bộ điều hợp vận chuyển thành tiền tố. Sau khi được gắn kết, bất kỳ yêu cầu HTTP nào được thực hiện bằng phiên đó có URL bắt đầu bằng tiền tố đã cho sẽ sử dụng Bộ điều hợp truyền tải đã cho

Nhiều chi tiết về triển khai Transport Adapter nằm ngoài phạm vi của tài liệu này, nhưng hãy xem ví dụ tiếp theo để biết trường hợp sử dụng SSL đơn giản. Để biết thêm điều đó, bạn có thể xem xét phân lớp con

Thí dụ. Phiên bản SSL cụ thể

Nhóm Yêu cầu đã đưa ra lựa chọn cụ thể để sử dụng bất kỳ phiên bản SSL nào được mặc định trong thư viện cơ bản [urllib3]. Thông thường, điều này không sao, nhưng đôi khi, bạn có thể thấy mình cần kết nối với điểm cuối dịch vụ sử dụng phiên bản không tương thích với phiên bản mặc định

Bạn có thể sử dụng Bộ điều hợp truyền tải cho việc này bằng cách tận dụng hầu hết triển khai HTTPAdapter hiện có và thêm tham số ssl_version được chuyển qua urllib3. Chúng tôi sẽ tạo Bộ điều hợp vận chuyển hướng dẫn thư viện sử dụng SSLv3

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
2

Chặn hoặc không chặn?

Với Bộ điều hợp vận chuyển mặc định tại chỗ, Yêu cầu không cung cấp bất kỳ loại IO không chặn nào. Thuộc tính sẽ chặn cho đến khi toàn bộ phản hồi được tải xuống. Nếu bạn yêu cầu mức độ chi tiết cao hơn, các tính năng phát trực tuyến của thư viện [xem ] cho phép bạn truy xuất số lượng phản hồi nhỏ hơn tại một thời điểm. Tuy nhiên, các cuộc gọi này vẫn sẽ chặn

Nếu bạn lo lắng về việc sử dụng tính năng chặn IO, thì có rất nhiều dự án kết hợp Yêu cầu với một trong các khung không đồng bộ của Python. Một số ví dụ tuyệt vời là request-threads, grequests, requests-futures và httpx

Tiêu đề đặt hàng

Trong những trường hợp bất thường, bạn có thể muốn cung cấp các tiêu đề theo thứ tự. Nếu bạn chuyển một đối số từ khóa

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
81 cho đối số từ khóa
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
82, điều đó sẽ cung cấp cho các tiêu đề một thứ tự. Tuy nhiên, thứ tự của các tiêu đề mặc định được Yêu cầu sử dụng sẽ được ưu tiên hơn, điều đó có nghĩa là nếu bạn ghi đè các tiêu đề mặc định trong đối số từ khóa
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
82, chúng có thể xuất hiện không theo thứ tự so với các tiêu đề khác trong đối số từ khóa đó

Nếu đây là vấn đề, người dùng nên xem xét việc đặt các tiêu đề mặc định trên một đối tượng, bằng cách đặt thành một tùy chỉnh

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
81. Thứ tự đó sẽ luôn được ưu tiên

Hết giờ

Hầu hết các yêu cầu đến các máy chủ bên ngoài phải có thời gian chờ kèm theo, trong trường hợp máy chủ không phản hồi kịp thời. Theo mặc định, các yêu cầu không hết thời gian trừ khi giá trị thời gian chờ được đặt rõ ràng. Nếu không có thời gian chờ, mã của bạn có thể bị treo trong vài phút hoặc hơn

Thời gian chờ kết nối là số giây Yêu cầu sẽ đợi máy khách của bạn thiết lập kết nối với máy từ xa [tương ứng với lệnh gọi connect[]] trên ổ cắm. Đó là một cách tốt để đặt thời gian chờ kết nối lớn hơn một chút so với bội số của 3, đây là cửa sổ truyền lại gói TCP mặc định

Khi máy khách của bạn đã kết nối với máy chủ và gửi yêu cầu HTTP, thời gian chờ đọc là số giây mà máy khách sẽ đợi máy chủ gửi phản hồi. [Cụ thể, đó là số giây mà máy khách sẽ đợi giữa các byte được gửi từ máy chủ. Năm 99. 9% trường hợp, đây là thời gian trước khi máy chủ gửi byte đầu tiên]

Nếu bạn chỉ định một giá trị duy nhất cho thời gian chờ, như thế này

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
3

Giá trị thời gian chờ sẽ được áp dụng cho cả thời gian chờ của

s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
87 và
s = requests.Session[]
s.auth = ['user', 'pass']
s.headers.update[{'x-test': 'true'}]

# both 'x-test' and 'x-test2' are sent
s.get['//httpbin.org/headers', headers={'x-test2': 'true'}]
88. Chỉ định một bộ nếu bạn muốn đặt các giá trị riêng biệt

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}
4

Nếu máy chủ từ xa rất chậm, bạn có thể yêu cầu Yêu cầu đợi phản hồi mãi mãi, bằng cách chuyển Không làm giá trị hết thời gian chờ và sau đó lấy một tách cà phê

Chủ Đề