Skip to content

Commit 59aae0d

Browse files
committed
switch to httpx for http2 support
1 parent 7dd247a commit 59aae0d

File tree

6 files changed

+77
-59
lines changed

6 files changed

+77
-59
lines changed

nc/prime_cache.py

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import time
33

44
import boto3
5-
import requests
5+
import httpx
66

77
from django.conf import settings
88
from django.db.models import F, Q, Sum
@@ -117,34 +117,41 @@ def get_group_urls(agency_id: int, officer_id: int = None) -> list[str]:
117117
def prime_group_cache(agency_id: int, num_stops: int, officer_id: int = None):
118118
"""Prime the cache for an agency (and optionally officer)"""
119119
logger.debug(f"Priming group cache ({agency_id=}, {officer_id=}, {num_stops=})...")
120-
session = requests.Session()
121120
# Attempt to match Browser behavior
122-
session.headers["Accept"] = "application/json, text/plain, */*"
123-
session.headers["Accept-Encoding"] = "gzip, deflate, br, zstd"
124-
# Configure basic auth if provided
121+
headers = {
122+
"Accpet": "application/json, text/plain, */*",
123+
"Accept-Encoding": "gzip, deflate, br, zstd",
124+
}
125+
auth = None
125126
if settings.CACHE_BASICAUTH_USERNAME and settings.CACHE_BASICAUTH_PASSWORD:
126-
session.auth = (settings.CACHE_BASICAUTH_USERNAME, settings.CACHE_BASICAUTH_PASSWORD)
127-
logger.info(
128-
f"Priming cache ({agency_id=}, {officer_id=}, {num_stops=}, {bool(session.auth)=})..."
129-
)
130-
urls = get_group_urls(agency_id=agency_id, officer_id=officer_id)
131-
with Timer() as group_timer:
132-
for url in urls:
133-
with Timer(threshold_seconds=CLOUDFRONT_RESPONSE_TIMEOUT - 1) as endpoint_timer:
134-
response = session.get(url)
135-
logger.debug(
136-
f"Queried {url=} ({response.headers=}, {response.request.headers=}, "
137-
f"{endpoint_timer.elapsed=})"
138-
)
139-
if endpoint_timer.exceeded_threshold:
140-
logger.warning(
141-
f"Slow response possibly not cached: {url} ({endpoint_timer.elapsed})"
127+
auth = httpx.BasicAuth(
128+
username=settings.CACHE_BASICAUTH_USERNAME, password=settings.CACHE_BASICAUTH_PASSWORD
129+
)
130+
with httpx.Client(auth=auth, headers=headers, http2=True) as client:
131+
# Configure basic auth if provided
132+
logger.info(
133+
f"Priming cache ({agency_id=}, {officer_id=}, {num_stops=}, {bool(client.auth)=})..."
134+
)
135+
urls = get_group_urls(agency_id=agency_id, officer_id=officer_id)
136+
with Timer() as group_timer:
137+
for url in urls:
138+
with Timer(threshold_seconds=CLOUDFRONT_RESPONSE_TIMEOUT - 1) as endpoint_timer:
139+
response = client.get(url)
140+
logger.debug(
141+
f"Queried {url=} ({response.headers=}, {response.request.headers=}, "
142+
f"{endpoint_timer.elapsed=})"
142143
)
143-
raise Exception(f"Slow prime cache response possibly not cached {url}")
144-
if response.status_code != 200:
145-
logger.warning(f"Status not OK: {url} ({response.status_code})")
146-
raise Exception(f"Request to {url} failed: {response.status_code}")
147-
logger.info(f"Primed cache ({agency_id=}, {officer_id=}, {num_stops=}, {group_timer.elapsed=})")
144+
if endpoint_timer.exceeded_threshold:
145+
logger.warning(
146+
f"Slow response possibly not cached: {url} ({endpoint_timer.elapsed})"
147+
)
148+
raise Exception(f"Slow prime cache response possibly not cached {url}")
149+
if response.status_code != 200:
150+
logger.warning(f"Status not OK: {url} ({response.status_code})")
151+
raise Exception(f"Request to {url} failed: {response.status_code}")
152+
logger.info(
153+
f"Primed cache ({agency_id=}, {officer_id=}, {num_stops=}, {group_timer.elapsed=})"
154+
)
148155

149156

150157
def invalidate_cloudfront_cache(sleep_seconds: int = 30) -> dict:

requirements/base/base.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ dj-database-url
2424
drf-extensions==0.7.1
2525
psycopg2==2.9.9
2626
brotli==1.1.0
27+
httpx[http2]
2728
requests==2.32.3
2829
urllib3==2.2.1
2930
six

requirements/base/base.txt

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#
77
amqp==5.2.0
88
# via kombu
9+
anyio==4.6.2.post1
10+
# via httpx
911
asgiref==3.5.2
1012
# via django
1113
billiard==4.2.0
@@ -26,7 +28,10 @@ celery==5.4.0
2628
census==0.8.22
2729
# via -r requirements/base/base.in
2830
certifi==2020.6.20
29-
# via requests
31+
# via
32+
# httpcore
33+
# httpx
34+
# requests
3035
charset-normalizer==3.0.1
3136
# via requests
3237
click==8.1.7
@@ -85,8 +90,25 @@ djangorestframework==3.12.4
8590
# drf-extensions
8691
drf-extensions==0.7.1
8792
# via -r requirements/base/base.in
93+
exceptiongroup==1.2.2
94+
# via anyio
95+
h11==0.14.0
96+
# via httpcore
97+
h2==4.1.0
98+
# via httpx
99+
hpack==4.0.0
100+
# via h2
101+
httpcore==1.0.6
102+
# via httpx
103+
httpx[http2]==0.27.2
104+
# via -r requirements/base/base.in
105+
hyperframe==6.0.1
106+
# via h2
88107
idna==2.10
89-
# via requests
108+
# via
109+
# anyio
110+
# httpx
111+
# requests
90112
jellyfish==0.6.1
91113
# via us
92114
jmespath==1.0.1
@@ -125,8 +147,14 @@ six==1.15.0
125147
# -r requirements/base/base.in
126148
# django-extensions
127149
# python-dateutil
150+
sniffio==1.3.1
151+
# via
152+
# anyio
153+
# httpx
128154
sqlparse==0.3.1
129155
# via django
156+
typing-extensions==4.12.2
157+
# via anyio
130158
tzdata==2024.1
131159
# via
132160
# celery

requirements/dev/dev.txt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ ansible-core==2.17.5
1616
# via ansible
1717
anyio==4.6.2.post1
1818
# via
19+
# -c requirements/dev/../base/base.txt
1920
# starlette
2021
# watchfiles
2122
appnope==0.1.4
@@ -49,7 +50,6 @@ cachetools==5.5.0
4950
certifi==2020.6.20
5051
# via
5152
# -c requirements/dev/../base/base.txt
52-
# -c requirements/dev/../test/test.txt
5353
# kubernetes
5454
# requests
5555
cffi==1.17.1
@@ -61,7 +61,6 @@ cfn-flip==1.3.0
6161
charset-normalizer==3.0.1
6262
# via
6363
# -c requirements/dev/../base/base.txt
64-
# -c requirements/dev/../test/test.txt
6564
# requests
6665
click==8.1.7
6766
# via
@@ -96,6 +95,7 @@ durationpy==0.9
9695
# via kubernetes
9796
exceptiongroup==1.2.2
9897
# via
98+
# -c requirements/dev/../base/base.txt
9999
# -c requirements/dev/../test/test.txt
100100
# anyio
101101
# ipython
@@ -104,11 +104,12 @@ executing==2.1.0
104104
google-auth==2.35.0
105105
# via kubernetes
106106
h11==0.14.0
107-
# via uvicorn
107+
# via
108+
# -c requirements/dev/../base/base.txt
109+
# uvicorn
108110
idna==2.10
109111
# via
110112
# -c requirements/dev/../base/base.txt
111-
# -c requirements/dev/../test/test.txt
112113
# anyio
113114
# requests
114115
imagesize==1.4.1
@@ -229,7 +230,6 @@ referencing==0.35.1
229230
requests==2.32.3
230231
# via
231232
# -c requirements/dev/../base/base.txt
232-
# -c requirements/dev/../test/test.txt
233233
# kubernetes
234234
# requests-oauthlib
235235
# sphinx
@@ -268,7 +268,9 @@ six==1.15.0
268268
# openshift
269269
# python-dateutil
270270
sniffio==1.3.1
271-
# via anyio
271+
# via
272+
# -c requirements/dev/../base/base.txt
273+
# anyio
272274
snowballstemmer==2.2.0
273275
# via sphinx
274276
sphinx==5.3.0
@@ -308,6 +310,7 @@ typer==0.12.5
308310
# via rstcheck
309311
typing-extensions==4.12.2
310312
# via
313+
# -c requirements/dev/../base/base.txt
311314
# -c requirements/dev/../test/test.txt
312315
# anyio
313316
# ipython
@@ -321,7 +324,6 @@ typing-extensions==4.12.2
321324
urllib3==2.2.1
322325
# via
323326
# -c requirements/dev/../base/base.txt
324-
# -c requirements/dev/../test/test.txt
325327
# botocore
326328
# kubernetes
327329
# requests

requirements/test/test.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ isort
66
pytest
77
pytest-cov
88
pytest-django
9-
requests-mock
109
factory_boy
1110
coverage
1211
# Linting

requirements/test/test.txt

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,8 @@
66
#
77
black==24.10.0
88
# via -r requirements/test/test.in
9-
certifi==2020.6.20
10-
# via
11-
# -c requirements/test/../base/base.txt
12-
# requests
139
cfgv==3.4.0
1410
# via pre-commit
15-
charset-normalizer==3.0.1
16-
# via
17-
# -c requirements/test/../base/base.txt
18-
# requests
1911
click==8.1.7
2012
# via
2113
# -c requirements/test/../base/base.txt
@@ -27,7 +19,9 @@ coverage[toml]==7.6.4
2719
distlib==0.3.9
2820
# via virtualenv
2921
exceptiongroup==1.2.2
30-
# via pytest
22+
# via
23+
# -c requirements/test/../base/base.txt
24+
# pytest
3125
factory-boy==3.3.1
3226
# via -r requirements/test/test.in
3327
faker==30.8.1
@@ -38,10 +32,6 @@ flake8==7.1.1
3832
# via -r requirements/test/test.in
3933
identify==2.6.1
4034
# via pre-commit
41-
idna==2.10
42-
# via
43-
# -c requirements/test/../base/base.txt
44-
# requests
4535
iniconfig==2.0.0
4636
# via pytest
4737
isort==5.13.2
@@ -87,12 +77,6 @@ pyyaml==6.0.2
8777
# via
8878
# -r requirements/test/test.in
8979
# pre-commit
90-
requests==2.32.3
91-
# via
92-
# -c requirements/test/../base/base.txt
93-
# requests-mock
94-
requests-mock==1.12.1
95-
# via -r requirements/test/test.in
9680
six==1.15.0
9781
# via
9882
# -c requirements/test/../base/base.txt
@@ -104,11 +88,8 @@ tomli==2.0.2
10488
# pytest
10589
typing-extensions==4.12.2
10690
# via
91+
# -c requirements/test/../base/base.txt
10792
# black
10893
# faker
109-
urllib3==2.2.1
110-
# via
111-
# -c requirements/test/../base/base.txt
112-
# requests
11394
virtualenv==20.27.0
11495
# via pre-commit

0 commit comments

Comments
 (0)