Python хүсэлт

Системийн дизайны ярилцлагын асуултууд маш нээлттэй байж болох тул зөв бэлтгэх арга замыг мэдэхэд хэтэрхий хэцүү байдаг. Одоо би худалдаж авсны дараа Amazon, Microsoft, Adobe-ийн дизайныг эвдэх боломжтой болсон энэ ном. Өдөр бүр нэг засвар хийх дизайны асуулт Мөн би та дизайны дугуйг эвдэж чадна гэж амлаж байна.

Python хэл дээр, Хүсэлт нь HTTP хүсэлт гаргахад ашигладаг суурилагдсан номын сан юм. Энэ нь энгийн API-ийн ард хүсэлт гаргах бүх нарийн төвөгтэй байдлыг нуун дарагдуулдаг бөгөөд ингэснээр бид үйлчилгээнүүдтэй хэрхэн харилцах, мэдээлэл цуглуулах тал дээр анхаарлаа төвлөрүүлж чадна.

Хүсэлтийн номын санд санал болгох маш олон ашигтай боломжууд бий. Энэхүү гарын авлагад янз бүрийн нөхцөл байдалд үндэслэн эдгээр функцуудыг хэрхэн өөрчилж, оновчтой болгохыг харцгаая. Мөн бид хүсэлтийг хэрхэн үр ашигтай ашиглах, програмыг удаашруулж буй гадны үйлчилгээнд үзүүлэх хүсэлтээс урьдчилан сэргийлэх талаар сурах болно.

Эдгээр нь энэ хичээлээс суралцах гол зүйлүүд юм:

  • Хамгийн түгээмэл HTTP аргыг ашиглан хүсэлт гаргах
  • Асуулгын мөр болон мессежийн хэсгийг ашиглан хүсэлтийнхээ толгой хэсэг болон өгөгдлийг тохируулна уу
  • Таны хүсэлт, хариултаас өгөгдлийг шалгана уу
  • Баталгаажсан хүсэлт гаргах
  • Таны програмыг нөөцлөх эсвэл удаашруулахаас сэргийлэхийн тулд хүсэлтээ тохируулаарай

Хэрэв та HTTP-ийн талаар маш энгийн мэдлэгтэй бол энэ курс танд зориулагдсан болно. Үгүй бол санаа зоволтгүй, дагаад явж болно. Эхэлцгээе.

Суулгах хүсэлтүүд:

Нарийвчилсан мэдээлэлд орохын өмнө хүсэлтийн санг суулгая.

Хүсэлтүүдийг суулгахын тулд терминалдаа доорх командыг бичнэ үү.

pip install requests

Хэрэв та pipenv-г илүүд үзэж байвал доорх тушаалыг ашиглана уу.

pipenv install requests

Суулгасны дараа үүнийг ашиглахын тулд өөрийн аппликейшнд импорт хийнэ үү.

import requests

Одоо бид гарын авлага руу орох бүх зүйл байгаа тул GET хүсэлт гаргаж эхэлцгээе.

GET хүсэлт:

GET ба POST бол хамгийн алдартай HTTP аргууд юм. Эдгээр аргууд нь хүсэлт гаргах явцад бид ямар үйлдэл хийхийг тодорхойлдог. Жишээлбэл, вэб хуудаснаас өгөгдөл авахын тулд GET, вэб хуудсанд өгөгдөл оруулахын тулд POST ашигладаг. Бид энэ хичээлийн дараагийн хэсэгт HTTP-ийн бусад аргуудыг авч үзэх болно.

GET хүсэлт гаргахын тулд ашиглана уу

requests.get()

Бид үүнийг GitHub-ийн root rest API-д GET хүсэлт гаргаснаар шалгаж болно:

import requests
print(requests.get('https://api.github.com'))
<Response [200]>

Та анхны GET хүсэлтээ амжилттай хийлээ. Одоо бид хүсэлтийн хариуг ойлгох ёстой.

Хариу арга хэмжээ:

Бид HTTP хүсэлт гаргах бүрд үр дүнд нь хариу ирдэг. Энэ нь хүсэлт амжилттай болсон эсэх талаарх мэдээллийг агуулдаг. Хариулах объектыг ойлгохын тулд бид түүний шинж чанар, зан үйлийг харах хэрэгтэй.

Үүнийг хийхийн тулд GET хүсэлт гаргах боловч үр дүнг хувьсагчид хадгална.

import requests
response=requests.get('https://api.github.com')

get()-ийн буцаах утга нь хариулт гэж нэрлэгддэг хувьсагчид хадгалагдаж буй Response-ийн жишээ юм. Одоо бид хариултын хувьсагчийг ашиглан HTTP хүсэлтийн үр дүнг цуглуулж болно.

Статус код:

Хэрэв та HTTP хүсэлт амжилттай болсон эсэхийг мэдэхийг хүсвэл статусын код нь үүнийг харах болно. Статус код нь хүсэлтийн төлөвийн талаарх мэдээллийг агуулна.

Жишээлбэл, статусын код 200 нь хүсэлт амжилттай болсныг, 404 нь хүссэн нөөц олдохгүй байгааг илтгэнэ. -ийг харна уу статус кодын жагсаалт таны хүсэлтийн үр дүнг ойлгохын тулд. C

Бидний өмнө нь хийсэн GET хүсэлтийн статусыг шалгана уу. Та статусын кодыг авах боломжтой

>>> response.status_code
200

Статусын код нь 200 бөгөөд энэ нь бидний GET хүсэлт амжилттай болсон бөгөөд хариулах объект нь хүссэн мэдээллийг агуулна гэсэн үг юм.

Та хариулт дээр үндэслэн шийдвэр гаргах нөхцөл байдалтай тулгарч магадгүй юм.

if response.status_code==200:
    print('Request is Successful!')
elif response.status_code==404:
    print('Resource not found')

Дээрх код нь хариултын төлөвийн код дээр үндэслэн тохирох мессежийг консол дээр хэвлэх болно.

Хүсэлтийн номын сан нь дээрх кодыг илүү хялбарчилдаг. Хэрэв та ямар нэгэн нөхцөл илэрхийлэл дэх Хариултыг үнэлвэл, төлөвийн код нь 200-аас 400-ийн хооронд байвал Үнэнийг буцаана, харин Худал буцаана.

Дээрх кодыг нөхцөлт илэрхийлэл ашиглан дахин бичье.

if response:
    print('Request is Successful!')
else:
    print('There is an error')

Энд бид 200-аас 400 хүртэлх төлөвийн кодыг баталгаажуулж байна. Тиймээс 204 АГУУЛГАГҮЙ(Хүсэлт амжилттай болсон ч мессежийн хэсэгт ямар ч агуулга байхгүй) болон 304 БУСАД ӨӨРЧЛӨГДӨГҮЙ гэсэн статусын кодууд мөн амжилттай гэж тооцогддог.

Тиймээс энэ товчилсон кодыг зөвхөн хүсэлт амжилттай болсон эсэхийг шалгахын тулд ашиглана уу. Дараа нь шаардлагатай бол статус код дээр үндэслэн хүсэлтийг зохицуулна.

Та мөн .raise_for_status()-г ашиглан амжилтгүй хүсэлт гаргахад онцгой тохиолдол гаргаж байна. Амжилттай хариу өгөхийн тулд үл хамаарах зүйл гарахгүй.

import requests
from requests.exceptions import HTTPError

urls=[
    'https://api.github.com',
    'https://api.github.com/valid_api'
]
for url in urls:
    try:
        response=requests.get(url)
        response.raise_for_status()
    except HTTPError as http_error:
        print(f'There is an HTTP Error : {http_error}')
    except Exception as error:
        print(f'Some other error : {error}')
    else:
        print('Request is Successful!')

.raise_for_status() арга нь 'Хүсэлт амжилттай боллоо!' амжилттай хүсэлтийн мессеж. Зарим статус кодын хувьд бид HTTPError гарч болзошгүй.

Агуулга:

Одоо бид статус кодыг ашиглан хүсэлтийн статусыг хэрхэн ойлгохыг мэддэг болсон. Гэхдээ хариуд нь илүү олон зүйл бий. Та серверээс буцааж илгээсэн өгөгдлийг хариултын хэсэгт харж болно. Үүнийг яаж хийхийг харцгаая.

Хариулт нь мессежийн үндсэн хэсэгт ачаа гэж нэрлэгддэг үнэ цэнэтэй мэдээллийг агуулдаг. Бид хариу үйлдлийн шинж чанар, зан төлөвийг ашиглан ачааллыг өөр өөр форматаар харж болно.

Жишээлбэл, хариултын агуулгыг байтаар харахын тулд .content ашиглана уу.

response=requests.get('https://api.github.com')
print(response.content)
b'{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"https://github.com/settings/connections/applications{/client_id}","authorizations_url":"https://api.github.com/authorizations","code_search_url":"https://api.github.com/search/code?q={query}{&page,per_page,sort,order}","commit_search_url":"https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}"}'

Хэрэв та UTF-8 шиг тэмдэгтийн кодчилол ашиглан хариултын ачааллын түүхий байтыг мөр болгон хөрвүүлэхийг хүсвэл бидэнд энэ ажлыг гүйцэтгэдэг .text байна.

>>> response.text
'{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"https://github.com/settings/connections/applications{/client_id}","authorizations_url":"https://api.github.com/authorizations","code_search_url":"https://api.github.com/search/code?q={query}{&page,per_page,sort,order}","commit_search_url":"https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}"}'

Байтаас мөр болгон хөрвүүлэхэд кодчилолын схем шаардлагатай. Хэрэв бид кодчилолын схемийг заагаагүй бол хүсэлтүүд хариултын толгой хэсэгт тулгуурлан нэгийг нь таамаглах болно. Та .текстийг ашиглахаасаа өмнө .encoding-ийг тодорхой тохируулж болно.

>>> response.encoding='utf-8'
>>> response.text
'{"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"https://github.com/settings/connections/applications{/client_id}","authorizations_url":"https://api.github.com/authorizations","code_search_url":"https://api.github.com/search/code?q={query}{&page,per_page,sort,order}","commit_search_url":"https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}"}'

Хариултын агуулга нь JSON объект шиг харагдаж байна. Чи чадна мөрийг хөрвүүлэх json.loads() эсвэл .json() ашиглан .текстээс JSON руу авсан.

>>> response.json()
{'current_user_url': 'https://api.github.com/user', 'current_user_authorizations_html_url': 'https://github.com/settings/connections/applications{/client_id}', 'authorizations_url': 'https://api.github.com/authorizations', 'code_search_url': 'https://api.github.com/search/code?q={query}{&page,per_page,sort,order}', 'commit_search_url': 'https://api.github.com/search/commits?q={query}{&page,per_page,sort,order}'}

Буцах утга нь толь бичиг учраас бид чадна түлхүүрийг ашиглан утгуудад хандах. Та статусын кодууд болон мессежийн үндсэн хэсгийг ашиглан илүү их зүйлийг хийх боломжтой. Гэсэн хэдий ч, хэрэв та хариултын мета өгөгдөл гэх мэт нэмэлт мэдээлэл авахыг хүсвэл хариултын толгой хэсгийг харах хэрэгтэй.

Хариултын толгой хэсэг:

Бид хариултын ачааллын төрөл, хариултыг кэшлэх хугацаа зэрэг олон хэрэгтэй мэдээллийг хариултын толгой хэсгээс авах боломжтой.

>>> response.headers
{'date': 'Fri, 12 Jun 2020 09:03:08 GMT', 'content-type': 'application/json; charset=utf-8', 'server': 'GitHub.com', 'status': '200 OK', 'cache-control': 'public, max-age=60, s-maxage=60', 'vary': 'Accept, Accept-Encoding, Accept, X-Requested-With, Accept-Encoding', 'etag': 'W/"c6bac8870a7f94b08b440c3d5873c9ca"'}

Буцаагдсан утга нь толь бичигтэй төстэй объект тул та түлхүүрийг ашиглан утгуудад хандах боломжтой. Жишээлбэл, хариу өгөх ачааллын төрлийг шалгахын тулд та "агуулгын төрөл" түлхүүрийн утгыг авч болно.

>>> response.headers['content-type']
'application/json; charset=utf-8'

HTTP тодорхойлолт нь толгойн толгойг том жижиг үсгээр тодорхойлдог. Тиймээс бид хариултын толгой хэсэгт хандахдаа хэргийн талаар санаа зовох шаардлагагүй болно.

>>> response.headers['CONTENT-TYPe']
'application/json; charset=utf-8'

Тохиолдолоос үл хамааран буцаах утга нь хэвээр байна.

Бид хариултын объектуудын ашигтай шинж чанар, зан үйлийн талаар авч үзсэн. Одоо GET хүсэлтийг хэрхэн өөрчлөх, үүний дагуу хариу хэрхэн өөрчлөгдөхийг харцгаая.

Асуулгын мөр:

URL дахь асуулгын мөрийн параметрүүдэд утгыг дамжуулах нь GET хүсэлтийг өөрчлөх нийтлэг аргуудын нэг юм. Бид get() аргын утгыг парамуудад дамжуулж болно. Хүсэлтийн сангаас хайх жишээг харцгаая GitHub репозиторууд.

import requests

response = requests.get(
    'https://api.github.com/search/repositories',
    params={'q': 'requests+language:python'},
)

json_response=response.json()
respository_details=json_response['items'][0]
print(f'Name of the respository : {respository_details["name"]}')
print(f'Description of the repository : {respository_details["description"]}')

Парамст дамжуулсан утгыг өөрчилснөөр та хариултын үр дүнг өөрчилж болно.

Бид өгөгдлийг толь бичгийн төрлөөр парамуудад дамжуулсан. Та мөн утгыг оруулах боломжтой

  • Товчнуудын жагсаалт:
response = requests.get(
    'https://api.github.com/search/repositories',
    params=[('q','requests+language:python')],
)
  • Байт:
response = requests.get(
    'https://api.github.com/search/repositories',
    params=b'q=requests+language:python',
)

Хүсэлтийн толгой:

Гарчиг нэмэх эсвэл өөрчилснөөр бид HTTP хүсэлтийг өөрчлөх боломжтой. get() аргын хувьд утгуудыг толь бичгийн форматаар толгойн параметрт дамжуулна. Зөвшөөрөх толгой хэсэгт зөөвөрлөгчийн төрлийг текст тааруулах гэж зааж өгснөөр бид өмнөх хүсэлтийн хайлтын үгтэй таарч байгааг онцолж болно.

import requests

response = requests.get(
    'https://api.github.com/search/repositories',
    params={'q': 'requests+language:python'},
    headers={'Accept': 'application/vnd.github.v3.text-match+json'},
)

json_response=response.json()
respository_details=json_response['items'][0]
print(f'Matching items : {respository_details["text_matches"]}')

Зөвшөөрөх толгой хэсэг нь серверт, манай програмын зохицуулдаг агуулгын төрлийг зааж өгдөг. 'application/vnd.github.v3.text-match+json' утга нь өмчийн GitHub Accept толгой хэсэг бөгөөд контент нь тусгай JSON формат юм.

Бусад HTTP аргууд:

Өмнө дурьдсанчлан, GET-ээс гадна бусад алдартай HTTP аргууд байдаг: POST, PUT, PATCH, DELETE, HEAD болон OPTIONS.

>>> requests.post('https://httpbin.org/post', data={'key':'value'})
>>> requests.put('https://httpbin.org/put', data={'key':'value'})
>>> requests.delete('https://httpbin.org/delete')
>>> requests.head('https://httpbin.org/get')
>>> requests.patch('https://httpbin.org/patch', data={'key':'value'})
>>> requests.options('https://httpbin.org/get')

Бид дээр дурдсан HTTP аргуудыг ашиглан httpbin үйлчилгээнд хүсэлт гаргаж байна. Та GET аргын хувьд бидний хийсэн аргатай төстэй арга тус бүрийн хариултыг шалгаж болно. Эдгээр аргууд тус бүрийн хариулт нь толгой, төлөвийн код болон бусад зүйлийг агуулна.

ТОЛГОЙ, УСТГАХ:

HEAD арга нь серверээс толгойн мэдээллийг шаарддаг.

>>> response = requests.head('https://httpbin.org/get')
>>> response.headers
{'Date': 'Sat, 13 Jun 2020 11:13:05 GMT', 'Content-Type': 'application/json', 'Content-Length': '308', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}

DELETE арга нь заасан нөөцийг устгадаг.

>>> response = requests.delete('https://httpbin.org/delete') 
>>> json_response=response.json() 
>>> json_response['args'] 
{}

POST, PUT болон PATCH:

POST, PUT, PATCH аргууд нь мессежийн биетээр дамжуулан серверт өгөгдлийг байршуулдаг. Бид функцийн өгөгдлийн параметрт ачааллыг дамжуулдаг.

Шинэ нөөц үүсгэхийн тулд POST аргыг ашигладаг. PUT болон PATCH нь бүрэн болон хэсэгчилсэн шинэчлэлтийг тус тусад нь ашигладаг.

Бид өгөгдлийг толь бичиг, залгуурын жагсаалт, байт эсвэл файл шиг объект руу дамжуулж болно. The өгөгдлийн төрөл бидний шаардаж буй үйлчилгээний тодорхой хэрэгцээнээс хамаарна. Жишээлбэл, хүсэлтийн агуулгын төрөл нь application/x-www-form-urlencoded бол та өгөгдлийг толь бичгийн хэлбэрээр илгээх хэрэгтэй.

json өгөгдлийг илгээхийн тулд өгөгдлийн оронд json параметрийг ашиглана уу. Хүсэлтийн сан нь json параметрийг ашиглах явцад бидэнд тохирох агуулгын төрлийг нэмнэ. Та хүсэлт гаргахад бидний хүлээн авсан хариултаас үүнийг баталгаажуулах боломжтой.

import requests

response=requests.post('https://httpbin.org/post', json={'key':'value'})
json_response=response.json()
print(json_response['data'])
print(json_response['headers']['Content-Type'])
{"key": "value"}
application/json

Бэлтгэсэн хүсэлт:

Хүсэлтийн сан нь очих сервер рүү хүсэлт илгээхийн өмнө толгой хэсгийг баталгаажуулж, JSON агуулгыг цуваа болгодог. .request-ийн тусламжтайгаар бид энэ PreparedRequest-ийг харж болно. PreparedRequest нь танд ачаалал, URL, толгой хэсэг гэх мэт хүсэлтийн талаарх мэдээллийг өгдөг.

import requests

response=requests.post('https://httpbin.org/post', json={'key':'value'})
print(response.request.url)
print(response.request.headers)
print(response.request.body)
https://httpbin.org/post
{'User-Agent': 'python-requests/2.23.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '16', 'Content-Type': 'application/json'}
b'{"key": "value"}'

Баталгаажуулалт:

Одоогийн байдлаар бид олон нийтийн API-д баталгаажуулаагүй хүсэлтийг хэрхэн хийхийг олж харсан. Гэхдээ үйлчилгээ таныг баталгаажуулахыг шаардаж магадгүй. Бид итгэмжлэлээ Зөвшөөрлийн толгой хэсэг эсвэл серверээр тодорхойлсон захиалгат толгойгоор дамжуулан илгээдэг. Хүсэлтийн функц нь итгэмжлэлийг дамжуулахын тулд auth параметрээр хангадаг.

GitHub-ийг харцгаая Баталгаажсан хэрэглэгч Баталгаажсан хэрэглэгчийн профайлын талаарх мэдээллийг өгдөг API. Баталгаажсан хэрэглэгчийн API-д хүсэлт гаргахын тулд хэрэглэгчийн нэр, нууц үгийг get()-д оруулаарай.

import requests
from getpass import getpass

print(requests.get('https://api.github.com/user', auth=('username', getpass())))
<Response [200]>

Хүсэлт амжилттай болохын тулд та хүчинтэй итгэмжлэлүүдийг нэвтрүүлэх шаардлагатай. Үгүй бол та 401 зөвшөөрөлгүй алдаа авах болно.

>>> requests.get('https://api.github.com/user')
<Response [401]>

Таныг хэрэглэгчийн нэр болон нууц үгээ нэвтрүүлэх бүрд HTTP-г ашиглан итгэмжлэлүүдийг ашиглах болно Хандалтын баталгаажуулалтын үндсэн схем. Тиймээс та HTTPBasicAuth ашиглан итгэмжлэлүүдийг тодорхой дамжуулж дээрх хүсэлтийг өөрчилж болно.

import requests
from getpass import getpass
from requests.auth import HTTPBasicAuth

print(requests.get('https://api.github.com/user', auth=HTTPBasicAuth('[email protected]', getpass())))
<Response [200]>

Хүсэлтийн номын сан нь HTTPDigestAuth болон HTTPProxyAuth гэх мэт бусад баталгаажуулалтын аргуудаар хангадаг.

Та мөн AuthBase-ийн дэд анги үүсгэж, __call__() аргыг хэрэгжүүлснээр өөрийн хувийн баталгаажуулалтын механизмтай болох боломжтой.

import requests
from requests.auth import AuthBase

class CustomTokenAuth(AuthBase):

    def __init__(self,token):
        self.token=token

    def __call__(self, request):
        request.headers['X-CustomTokenAuth']=f'{self.token}'
        return request

print(requests.get('https://httpbin.org/get', auth=CustomTokenAuth('sample_token123')))
<Response [200]>

Энд бид токен хүлээн авч, хүсэлтийн X-CustomTokenAuth толгой хэсэгт нэмж байна. Гэхдээ баталгаажуулалтын механизм муу байвал аюулгүй байдлын сул тал бий болно. Тиймээс Basic эсвэл OAuth гэх мэт туршиж үзсэн, үнэн зөв баталгаажуулах схемүүдийг баримтлах нь үргэлж дээр юм.

SSL гэрчилгээ баталгаажуулалт:

Бид вэб хуудаснаас мэдээлэл илгээх, хүлээн авах үед аюулгүй байдал хамгийн чухал байдаг. HTTP-ээр дамжуулан аюулгүй сайтуудтай харилцах нь зорилтот серверийн SSL сертификатыг баталгаажуулах замаар SSL ашиглан шифрлэгдсэн холболтоор үүсгэгддэг.

Хүсэлтийн номын сан нь бидний хувьд үүнийг анхдагчаар хийдэг. Та шалгах параметрийг худал гэж оруулснаар энэ үйлдлийг хүчингүй болгож болно. Хүсэлт нь таныг аюулгүй бус хүсэлт гаргаж байгааг анхааруулж байна.

>>> requests.get('https://api.github.com', verify=False)
C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequest
Warning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)
<Response [200]>

Гүйцэтгэлийн:

Бид үйлдвэрлэлийн орчинд хүсэлтийг ашиглахдаа гүйцэтгэлийг анхаарч үзэх хэрэгтэй. Аппликешныг ямар ч асуудалгүйгээр ажиллуулахын тулд бид завсарлагааны хяналт, сесс болон дахин оролдлого хийх хязгаарыг анхаарч үзэх хэрэгтэй.

Завсарлага:

Бид гадны үйлчилгээнд хүсэлт гаргахад систем хариуг нь хүлээж байдаг. Хэрэв хариуг буцааж авахад хэтэрхий удаж байвал энэ нь хэрэглэгчийн муу туршлагад хүргэж болзошгүй эсвэл арын программ гацаж болзошгүй.

Хүсэлтийн сан нь өгөгдмөлөөр хариуг тодорхойгүй хугацаагаар хүлээх болно. Гэхдээ та завсарлах параметрийн тусламжтайгаар завсарлах хугацааг зааж өгснөөр үүнээс урьдчилан сэргийлэх боломжтой. Хугацаа нь хугацаа дуусахаас өмнө хариу хүлээх секундын хугацааг илэрхийлэх бүхэл тоо эсвэл хөвөх утгыг хүлээн авдаг.

>>> requests.get('https://api.github.com', timeout=3)
<Response [200]>
>>> requests.get('https://api.github.com', timeout=4.5)
<Response [200]>

Эхний хүсэлт 3 секундын дараа, хоёр дахь хүсэлт 4.5 секундын дараа дуусна.

Хугацаа нь мөн tuple-г хүлээн авдаг. Эхний утга нь үйлчлүүлэгчийн холболтыг бий болгох хугацаа, хоёр дахь утга нь холболт үүсгэсний дараа хариу хүлээх хугацааг илэрхийлнэ.

>>> requests.get('https://api.github.com', timeout=(3,4.5))
<Response [200]>

Холболтыг 200 секундын дотор хийж, холболт үүсгэснээс хойш 3 секундын дотор хариу ирвэл та 4.5 хариу авах болно. Хүсэлтийн хугацаа хэтэрсэн тохиолдолд та мөн үл хамаарах хугацааг нэмэгдүүлэх боломжтой.

import requests
from requests.exceptions import Timeout

try:
    response = requests.get('https://api.github.com', timeout=0.01)

except Timeout:
    print('Request timed out')
else:
    print('Request is successful')
Request timed out

Сеанс объект:

Өнөөг хүртэл бид get() болон post() зэрэг өндөр түвшний хүсэлтийн API-г хийхэд холболтууд хэрхэн бий болох талаар санаа зовоогүй байна. Эдгээр функцууд нь хүсэлт гаргахад юу болж байгааг зөвхөн хийсвэр байдлаар илэрхийлдэг. Эдгээр хийсвэрлэлүүдийн доор session хэмээх анги байдаг. Хүсэлтийн гүйцэтгэлийг сайжруулах эсвэл хүсэлтээ хянахын тулд та сессийн жишээг шууд ашиглах хэрэгтэй.

Хүсэлтийн дагуу параметрүүдийг хадгалахын тулд сешнүүдийг ашигладаг. Жишээлбэл, та олон хүсэлт дээр ижил зөвшөөрлийн итгэмжлэлүүдийг ашиглах шаардлагатай сессийг ашиглаж болно.

import requests
from getpass import getpass

with requests.Session() as session:
    session.auth = ('username', getpass())

    response = session.get('https://api.github.com/user')

print(response.headers)
print(response.json())

Сеанс объектыг нэвтрэлт танилтын итгэмжлэлээр эхлүүлсний дараа бид сесстэй хүсэлт гаргах бүрт энэ нь итгэмжлэлүүдийг хэвээр үлдээх болно.

Холболт хийхэд сессийг ашиглах бүрдээ тэр холболтыг холболтын санд хадгалдаг. Дахин ижил холболт хийх шаардлагатай бол шинээр холболт үүсгэхийн оронд холболтын сангаас холболтыг дахин ашиглах болно. Тиймээс тогтвортой холболтоор гүйцэтгэлийг оновчтой болгодог.

Хамгийн их дахин оролдлого:

Таны хүсэлт амжилтгүй болох үед та ConnectionError авах болно, гэхдээ та програмаа дахин оролдохыг хүсэж байна. Хүсэлтийн номын сан бидний төлөө үүнийг хийхгүй байна. Шийдэл нь захиалгат тээврийн адаптерийг хэрэгжүүлэх явдал юм.

Тээврийн адаптерийн тусламжтайгаар та бидний харилцаж буй үйлчилгээ тус бүрийн тохиргооны багцыг тодорхойлж болно. Жишээлбэл, та https://api.github.com сайтаас бүх хүсэлтээ ConnectionError-ийг нэмэгдүүлэхээс өмнө 5 удаа оролдохыг хүсч байна. Өөрийнхөө тээврийн адаптерийг бүтээж, max_retries параметрээ 5 удаа тохируулж, одоо байгаа сесс рүү холбоно уу.

import requests
from requests.adapters import HTTPAdapter
from requests.exceptions import ConnectionError

transport_adapter = HTTPAdapter(max_retries=5)

session = requests.Session()

session.mount('https://api.github.com', transport_adapter)

try:
    session.get('https://api.github.com')
except ConnectionError as error:
    print(error)

Transport_adaptor-ийг сессийн инстанцад холбосноор сессийн инстанц https://api.github.com руу хийсэн хүсэлт бүрийн тохиргоог дагаж мөрдөх болно.

 

Crack системийн дизайны ярилцлага
Translate »