Python İstəkləri

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Pythonda, sorğu HTTP sorğuları etmək üçün istifadə edilən daxili kitabxanadır. O, sadə API-nin arxasında sorğuların edilməsinin bütün mürəkkəbliklərini gizlədir ki, biz diqqəti xidmətlərlə necə qarşılıqlı əlaqədə olmağımıza və məlumatların toplanmasına yönəldə bilək.

Sorğular kitabxanası təklif etmək üçün çoxlu faydalı xüsusiyyətlərə malikdir. Bu təlimatda gəlin bu xüsusiyyətlərin müxtəlif vəziyyətlərə əsaslanaraq fərdiləşdirilmiş və optimallaşdırılmış şəkildə necə edildiyini görək. Həmçinin, sorğulardan necə səmərəli istifadə etməyi və tətbiqi yavaşlatan xarici xidmətlərə müraciətlərin qarşısını almağı öyrənəcəyik.

Bu dərslikdən öyrənəcəyiniz əsas şeylər bunlardır:

  • Ən ümumi HTTP metodlarından istifadə edərək sorğular edin
  • Sorğu sətirindən və mesaj mətnindən istifadə edərək sorğularınızın başlıqlarını və məlumatlarını fərdiləşdirin
  • Sorğularınızdan və cavablarınızdan məlumatları yoxlayın
  • Doğrulanmış sorğular edin
  • Tətbiqinizin ehtiyat nüsxələnməsinin və ya yavaşlamasının qarşısını almaq üçün sorğularınızı konfiqurasiya edin

Əgər HTTP haqqında çox sadə biliyiniz varsa, bu kurs sizin üçündür. Əgər yoxsa, narahat olmayın, hələ də davam edə bilərsiniz. Gəlin başlayaq.

Quraşdırma sorğuları:

Detallara keçməzdən əvvəl sorğular kitabxanasını quraşdıraq.

Sorğuları quraşdırmaq üçün terminalda aşağıdakı əmri yazın.

pip install requests

Əgər pipenv-ə üstünlük verirsinizsə, aşağıdakı əmrdən istifadə edin:

pipenv install requests

Quraşdırıldıqdan sonra istifadə etmək üçün tətbiqinizə idxal edin.

import requests

İndi dərsliyə keçmək üçün hər şeyimiz var, gəlin GET sorğuları ilə başlayaq.

GET sorğusu:

GET və POST ən populyar HTTP metodlarıdır. Bu üsullar sorğu edərkən hansı hərəkəti yerinə yetirəcəyimizi müəyyənləşdirir. Məsələn, GET-dən istifadə etdiyimiz veb-səhifədən məlumat əldə etmək və veb-səhifəyə məlumat göndərmək üçün POST-dan istifadə edirik. Bu kursun sonrakı hissəsində digər HTTP üsullarını əhatə edəcəyik.

GET sorğusu etmək üçün istifadə edin

requests.get()

Bunu GitHub-un kök istirahət API-sinə GET sorğusu etməklə yoxlaya bilərik:

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

Siz ilk GET sorğularınızı uğurla etdiniz. İndi sorğunun qaytardığı cavabı başa düşməliyik.

Cavab:

Hər dəfə HTTP sorğusu etdikdə, nəticədə cavab alırıq. Sorğunun uğurlu olub-olmaması barədə məlumat var. Cavab obyektini başa düşmək üçün onun atributlarına və davranışlarına nəzər salmalıyıq.

Bunu etmək üçün GET sorğusu verin, lakin nəticəni dəyişəndə ​​saxlayın.

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

get() funksiyasının qaytarılan dəyəri cavab adlı dəyişəndə ​​saxladığımız Response nümunəsidir. İndi cavab dəyişənindən istifadə edərək HTTP sorğusunun nəticəsini toplaya bilərik.

Status Kodu:

HTTP sorğunuzun uğurlu olub-olmadığını bilmək istəyirsinizsə, status kodu ona baxmalı olacaq. Status kodu sorğunun statusu haqqında məlumatı ehtiva edir.

Məsələn, status kodu 200 sorğunun uğurlu olduğunu və 404 tələb olunan resursun tapılmadığını göstərir. -a nəzər salın status kodlarının siyahısı sorğunuzun nəticəsini başa düşmək üçün. C

Daha əvvəl etdiyimiz GET sorğusunun vəziyyətini yoxlayın. Status kodunu əldə edə bilərsiniz

>>> response.status_code
200

Status kodu 200-dür, bu o deməkdir ki, GET sorğumuz uğurludur və cavab obyekti tələb olunan məlumatı ehtiva edir.

Cavab əsasında qərar verməli olduğunuz bir vəziyyətlə qarşılaşa bilərsiniz.

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

Yuxarıdakı kod cavabın status koduna əsasən müvafiq mesajı konsola çap edəcək.

Sorğular kitabxanası yuxarıdakı kodu daha da sadələşdirir. Cavabı hər hansı şərti ifadədə qiymətləndirsəniz, status kodu 200 ilə 400 arasında olarsa, True qaytarır, əks halda Yanlış qaytarır.

Şərti ifadədən istifadə edərək yuxarıdakı kodu yenidən yazaq:

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

Burada biz 200 və 400 arasındakı status kodunu təsdiqləyirik. Beləliklə, status kodları 204 NO CONTENT (Sorğu uğurludur, lakin mesajın mətnində heç bir məzmun yoxdur) və 304 DƏYİŞƏNMƏDİ də uğurlu hesab olunur.

Beləliklə, bu qısaldılmış kodu yalnız sorğunun ümumilikdə uğurlu olub olmadığını yoxlamaq üçün istifadə edin. Və lazım olduqda status kodu əsasında sorğunu idarə edin.

Siz həmçinin .raise_for_status() funksiyasından istifadə edərək uğursuz sorğu üçün istisna qaldırırsınız. Uğurlu cavab üçün heç bir istisna qaldırılmayacaq.

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() metodu 'Sorğu Uğurludur!' uğurlu sorğular üçün mesaj. Müəyyən status kodları üçün HTTPError əldə edə bilərik.

Məqalələr:

İndi status kodundan istifadə edərək sorğunun vəziyyətini başa düşməyi necə bildiyimizi bilirik. Ancaq cavab üçün daha çox şey var. Siz əslində server tərəfindən geri göndərilən məlumatları cavab orqanında görə bilərsiniz. Gəlin bunu necə edəcəyinə baxaq.

Cavab mesajın mətnində faydalı yük deyilən dəyərli məlumatları ehtiva edir. Cavabın atributlarından və davranışından istifadə edərək faydalı yükü müxtəlif formatlarda görə bilərik.

Məsələn, cavabın məzmununu baytlarda görmək üçün .content istifadə edin.

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}"}'

Əgər cavab yükünün xam baytlarını UTF-8 kimi simvol kodlaşdırmasından istifadə edərək sətirlərə çevirmək istəyirsinizsə, o zaman bizim işimizi görən .mətnimiz var.

>>> 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}"}'

Baytdan sətirə çevrilmə kodlaşdırma sxemini tələb edir. Əgər kodlaşdırma sxemini müəyyən etməsək, sorğular cavabın başlığına əsasən birini təxmin edəcək. Siz .text istifadə etməzdən əvvəl .kodlaşdırmanı açıq şəkildə təyin edə bilərsiniz.

>>> 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}"}'

Cavabın məzmunu JSON obyektinə bənzəyir. Bacararsan sətri çevirin json.loads() və ya .json() istifadə edərək .text-dən JSON-a əldə edilir.

>>> 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}'}

Qaytarılan dəyər lüğət olduğu üçün biz edə bilərik onun açarından istifadə edərək dəyərlərə daxil olun. Siz status kodları və mesajın mətni ilə daha çox şey edə bilərsiniz. Yenə də cavabın metadatası kimi daha çox məlumat istəyirsinizsə, cavabın başlığına baxmaq lazımdır.

Cavab Başlığı:

Cavab başlığından cavab yükünün növü və cavabı keşləmə vaxtı kimi bir çox faydalı məlumat əldə edə bilərik.

>>> 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"'}

Qaytarılan dəyər lüğətə bənzər obyektdir ki, açardan istifadə edərək dəyərlərə daxil ola biləsiniz. Məsələn, cavab yükünün növünü yoxlamaq üçün "məzmun növü" açarının dəyərini əldə edə bilərsiniz.

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

HTTP spesifikasiyası başlıqların böyük hərflərə həssas olmasını müəyyənləşdirir. Beləliklə, cavab başlıqlarına daxil olarkən işdən narahat olmağımıza ehtiyac yoxdur.

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

Vəziyyətdən asılı olmayaraq, qaytarma dəyəri eyni qalır.

Biz cavab obyektlərinin faydalı atributlarını və davranışlarını əhatə etdik. İndi GET sorğusunun necə fərdiləşdirilməsinə və cavabın buna uyğun olaraq necə dəyişdirilməsinə baxaq.

Sorğu sətri:

URL-də sorğu sətirinin parametrlərinə dəyərlərin ötürülməsi GET sorğusunu fərdiləşdirməyin ümumi yollarından biridir. Biz get() metodunda dəyərləri paramlara ötürə bilərik. Sorğu kitabxanasında axtarış etmək üçün nümunəyə baxaq GitHub depoları.

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"]}')

Paramlara verilən dəyəri dəyişdirərək, cavabın nəticəsini dəyişə bilərsiniz.

Biz məlumatları lüğət tipində paramlara ötürdük. Siz həmçinin dəyərləri daxil edə bilərsiniz

  • Tuples siyahısı:
response = requests.get(
    'https://api.github.com/search/repositories',
    params=[('q','requests+language:python')],
)
  • Bayt:
response = requests.get(
    'https://api.github.com/search/repositories',
    params=b'q=requests+language:python',
)

Sorğu Başlıqları:

Başlıqları əlavə etməklə və ya dəyişdirməklə biz HTTP sorğusunu fərdiləşdirə bilərik. Get() metodunda dəyərləri lüğət formatında başlıqlar parametrinə ötürün. Qəbul et başlığında media növünü mətn uyğunluğu kimi göstərməklə biz əvvəlki sorğunun axtarış termininə uyğunluğu vurğulaya bilərik.

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"]}')

Qəbul başlığı serverə, proqramımızın idarə etdiyi məzmunun növünü bildirir. 'application/vnd.github.v3.text-match+json' dəyəri özəl GitHub Accept başlığıdır və məzmun xüsusi JSON formatıdır.

Digər HTTP üsulları:

Daha əvvəl qeyd edildiyi kimi, GET-dən başqa digər məşhur HTTP üsulları da var: POST, PUT, PATCH, DELETE, HEAD və 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')

Yuxarıda qeyd olunan HTTP metodlarından istifadə edərək httpbin xidmətinə sorğu göndəririk. GET metodu üçün etdiyimiz kimi hər bir üsul üçün cavabı yoxlaya bilərsiniz. Bu metodların hər biri üçün cavab başlıqları, status kodu və daha çoxunu ehtiva edir.

HEAD və SİL:

HEAD metodu serverdən başlıqları tələb edir.

>>> 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 metodu göstərilən resursu silir.

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

POST, PUT və PATCH:

POST, PUT və PATCH metodları mesajın mətni vasitəsilə məlumatları serverə göndərir. Faydalı yükü funksiyanın data parametrində keçirik.

POST metodu yeni resurs yaratmaq üçün istifadə olunur. PUT və PATCH müvafiq olaraq tam və qismən yeniləmə üçün istifadə olunur.

Biz verilənləri lüğətə, tuple siyahısına, baytlara və ya fayla bənzər obyektə ötürə bilərik. The verilənlərin növü tələb etdiyimiz xidmətin xüsusi ehtiyaclarından asılıdır. Məsələn, sorğunun məzmun növü proqram/x-www-form-urlencoded olarsa, onda siz məlumatları lüğət formatında göndərməlisiniz.

json məlumatlarını göndərmək üçün məlumat əvəzinə json parametrindən istifadə edin. Sorğu kitabxanası json parametrindən istifadə edərkən bizim üçün uyğun məzmun növünü əlavə edəcək. Bunu sorğu ilə bağlı aldığımız cavabdan yoxlaya bilərsiniz.

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

Hazırlanmış Sorğu:

Sorğular kitabxanası təyinat serverinə sorğu göndərməzdən əvvəl başlığı təsdiqləyir və JSON məzmununu seriallaşdırır. .request ilə biz bu PreparedRequest-i görə bilərik. PreparedRequest sizə yük, URL, başlıqlar və s. kimi sorğu haqqında məlumat verir.

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"}'

İdentifikasiyası:

İndiyə qədər biz ictimai API-lərə doğrulanmamış sorğuların necə edildiyini görmüşük. Lakin xidmətlər sizdən autentifikasiyanızı tələb edə bilər. Biz etimadnamələrimizi Avtorizasiya başlığı və ya server tərəfindən müəyyən edilmiş fərdi başlıq vasitəsilə göndəririk. Sorğular funksiyası etimadnamələri ötürmək üçün auth parametrini təmin edir.

Gəlin GitHub-a nəzər salaq Doğrulanmış İstifadəçi Doğrulanmış istifadəçinin profili haqqında məlumat verən API. Təsdiqlənmiş İstifadəçi API-sinə sorğu göndərmək üçün istifadəçi adı və şifrəni get() qovluğuna daxil edin.

import requests
from getpass import getpass

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

Sorğunun uğurlu olması üçün etibarlı etimadnamələri keçməlisiniz. Əks halda 401 icazəsiz xəta alacaqsınız.

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

İstifadəçi adı və parol sorğularını keçirdiyiniz zaman HTTP-dən istifadə edərək etimadnaməsini tətbiq edəcəklər Əsas giriş identifikasiyası sxemi. Beləliklə, siz HTTPBasicAuth istifadə edərək etimadnamələri açıq şəkildə ötürməklə yuxarıdakı sorğunu dəyişdirə bilərsiniz.

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]>

Sorğular kitabxanası HTTPDigestAuth və HTTPProxyAuth kimi digər autentifikasiya üsullarını da təmin edir.

Siz həmçinin AuthBase alt sinifini yaradaraq __call__() metodunu tətbiq etməklə fərdi autentifikasiya mexanizminizə sahib ola bilərsiniz.

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]>

Burada bir nişan alırıq və onu sorğunun X-CustomTokenAuth başlığına əlavə edirik. Lakin autentifikasiya mexanizmi pis olarsa, təhlükəsizlik zəiflikləri olacaq. Beləliklə, Basic və ya OAuth kimi sınanmış və doğru auth sxemlərinə sadiq qalmaq həmişə daha yaxşıdır.

SSL Sertifikat Doğrulaması:

Veb-səhifədən məlumat göndərdiyimiz və qəbul etdiyimiz zaman təhlükəsizlik ən vacibdir. HTTP üzərindən təhlükəsiz saytlarla əlaqə, hədəf serverin SSL sertifikatını yoxlamaq yolu ilə SSL istifadə edərək şifrələnmiş əlaqə ilə qurulur.

Sorğular kitabxanası bunu bizim üçün standart olaraq edir. Doğrulama parametrini Yanlış olaraq ötürməklə bu davranışı ləğv edə bilərsiniz. Sorğu həmçinin etibarsız sorğu göndərdiyiniz barədə xəbərdarlıq edir.

>>> 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]>

Performansı:

İstehsal mühitində sorğulardan istifadə edərkən performansa diqqət yetirməliyik. Tətbiqin heç bir problem olmadan işləməsini təmin etmək üçün biz fasiləyə nəzarət, sessiyalar və təkrar cəhd limitlərinə diqqət yetirməliyik.

Vaxt:

Xarici xidmətə sorğu göndərdiyimiz zaman sistem cavab gözləyir. Cavabın geri qaytarılması çox uzun çəkərsə, bu, pis istifadəçi təcrübəsinə səbəb ola bilər və ya arxa plan tətbiqi dayana bilər.

Sorğu kitabxanası standart olaraq cavab üçün qeyri-müəyyən müddətə gözləyəcək. Lakin siz timeout parametrinin köməyi ilə fasilə müddətini təyin etməklə bunun qarşısını ala bilərsiniz. Taymout, vaxt aşımından əvvəl cavabı gözləmək üçün saniyədəki vaxtı təmsil edən tam və ya float dəyərlərini qəbul edir.

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

Birinci sorğu 3 saniyədən sonra, ikinci sorğu isə 4.5 saniyədən sonra bitəcək.

Taym-aut də tuple qəbul edir. Birinci dəyər müştəriyə əlaqə yaratmağa icazə verilən vaxt, ikinci dəyər isə əlaqə qurulduqdan sonra cavab gözləmək vaxtıdır.

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

Bağlantı 200 saniyə ərzində qurularsa və əlaqə qurulduqdan sonra 3 saniyə ərzində cavab alınarsa, siz 4.5 Cavab alacaqsınız. Siz həmçinin sorğunun vaxt aşımı istisnasını artıra bilərsiniz.

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

Sessiya obyekti:

Bu günə qədər get() və post() kimi yüksək səviyyəli sorğu API-ləri etdikdə əlaqələrin necə qurulacağından narahat olmamışıq. Bu funksiyalar sorğu etdikdə baş verənlərin sadəcə abstraksiyalarıdır. Bu abstraksiyaların altında sessiya adlı bir sinif var. Sorğuların performansını yaxşılaşdırmaq və ya sorğularınıza nəzarət etmək üçün siz birbaşa sessiya nümunəsindən istifadə etməlisiniz.

Sorğular arasında parametrləri saxlamaq üçün seanslar istifadə olunur. Məsələn, birdən çox sorğuda eyni avtorizasiya etimadnaməsini istifadə etməyiniz lazım olan sessiyadan istifadə edə bilərsiniz.

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())

Sessiya obyekti autentifikasiya etimadnaməsi ilə işə salındıqdan sonra biz hər dəfə sessiya ilə sorğu göndərəndə o, etimadnaməsini saxlayacaq.

Bir seans əlaqə yaratmaq üçün istifadə edildikdə, bu əlaqəni əlaqə hovuzunda saxlayır. Yenidən eyni əlaqəyə ehtiyac yarandıqda, yenisini qurmaq əvəzinə, əlaqə hovuzundan olanı yenidən istifadə edəcək. Beləliklə, performans davamlı bir əlaqə ilə optimallaşdırılır.

Maksimum təkrar cəhdlər:

Sorğunuz uğursuz olduqda siz ConnectionError alacaqsınız, lakin siz tətbiqinizin yenidən cəhd etməsini istəyirsiniz. Sorğular kitabxanası bunu bizim üçün etmir. Həll xüsusi Nəqliyyat Adaptorunu tətbiq etməkdir.

Nəqliyyat Adapterləri ilə siz qarşılıqlı əlaqədə olduğumuz hər xidmət üçün bir sıra konfiqurasiyalar müəyyən edə bilərsiniz. Məsələn, siz https://api.github.com ünvanına olan bütün sorğularınızın ConnectionError-u qaldırmazdan əvvəl 5 dəfə sınamasını istəyirsiniz. Öz Nəqliyyat Adapterinizi yaradın, onun max_retries parametrini 5 dəfə təyin edin və onu mövcud sessiyaya quraşdırın.

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-u sessiya instansiyasına quraşdırmaqla, sessiya nümunəsi https://api.github.com ünvanına edilən hər sorğu üçün öz konfiqurasiyasına riayət edəcək.

 

Crack Sistemi Dizayn Müsahibələri
Translate »