Add Cache-Control headers to output #1
							
								
								
									
										19
									
								
								app/main.py
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								app/main.py
									
									
									
									
									
								
							| @ -15,12 +15,14 @@ app = FastAPI() | |||||||
| GEOLITE2_ASN_DB = '/usr/local/share/GeoIP/GeoLite2-ASN.mmdb' | GEOLITE2_ASN_DB = '/usr/local/share/GeoIP/GeoLite2-ASN.mmdb' | ||||||
| GEOLITE2_CITY_DB = '/usr/local/share/GeoIP/GeoLite2-City.mmdb' | GEOLITE2_CITY_DB = '/usr/local/share/GeoIP/GeoLite2-City.mmdb' | ||||||
|  |  | ||||||
|  |  | ||||||
| class IPAddressParam(BaseModel): | class IPAddressParam(BaseModel): | ||||||
|     ''' |     ''' | ||||||
|     Payload entry as used in POST |     Payload entry as used in POST | ||||||
|     ''' |     ''' | ||||||
|     ip: Union[IPv6Address, IPv4Address] |     ip: Union[IPv6Address, IPv4Address] | ||||||
|  |  | ||||||
|  |  | ||||||
| class Locality(BaseModel): | class Locality(BaseModel): | ||||||
|     ''' |     ''' | ||||||
|     Locality data |     Locality data | ||||||
| @ -30,6 +32,7 @@ class Locality(BaseModel): | |||||||
|     continent: Optional[str] = None |     continent: Optional[str] = None | ||||||
|     is_eu: bool = False |     is_eu: bool = False | ||||||
|  |  | ||||||
|  |  | ||||||
| class GeoLocation(BaseModel): | class GeoLocation(BaseModel): | ||||||
|     ''' |     ''' | ||||||
|     Geolocation data model |     Geolocation data model | ||||||
| @ -40,9 +43,12 @@ class GeoLocation(BaseModel): | |||||||
|     network: Optional[Union[IPv6Network, IPv4Network]] = None |     network: Optional[Union[IPv6Network, IPv4Network]] = None | ||||||
|     locality: Locality = Locality() |     locality: Locality = Locality() | ||||||
|  |  | ||||||
|  |  | ||||||
| @app.post("/") | @app.post("/") | ||||||
| async def root_post(ipaddresses: Annotated[list[IPAddressParam], | async def root_post(ipaddresses: Annotated[ | ||||||
|                                     Body(title="The IPAddresses to geolocate")] |     list[IPAddressParam], | ||||||
|  |     Body(title="The IPAddresses to geolocate")], | ||||||
|  |                     response: Response | ||||||
|                     ) -> list[GeoLocation]: |                     ) -> list[GeoLocation]: | ||||||
|     ''' |     ''' | ||||||
|     Return GeoLocation item(s) for a list of IPAddressParam objects |     Return GeoLocation item(s) for a list of IPAddressParam objects | ||||||
| @ -72,23 +78,28 @@ async def root_post(ipaddresses: Annotated[list[IPAddressParam], | |||||||
|                     ip=ipaddress.ip |                     ip=ipaddress.ip | ||||||
|                     ) |                     ) | ||||||
|                 ) |                 ) | ||||||
|  |     if geolocations: | ||||||
|  |         response.headers['Cache-Control'] = 'private, max-age=604800' | ||||||
|     return geolocations |     return geolocations | ||||||
|  |  | ||||||
|  |  | ||||||
| @app.get("/{ipaddress}") | @app.get("/{ipaddress}") | ||||||
| async def root_get(ipaddress: Annotated[Union[IPv4Address,IPv6Address], | async def root_get(ipaddress: Annotated[ | ||||||
|  |     Union[IPv4Address, IPv6Address], | ||||||
|     Path(title="The IPAddress to geolocate")], |     Path(title="The IPAddress to geolocate")], | ||||||
|                    response: Response |                    response: Response | ||||||
|                    ) -> GeoLocation: |                    ) -> GeoLocation: | ||||||
|     ''' |     ''' | ||||||
|     Look up geolocation for ip in path parameter |     Look up geolocation for ip in path parameter | ||||||
|     ''' |     ''' | ||||||
|     locations = await root_post([IPAddressParam(ip=ipaddress)]) |     locations = await root_post([IPAddressParam(ip=ipaddress)], response) | ||||||
|     if locations: |     if locations: | ||||||
|  |         response.headers['Cache-Control'] = 'private, max-age=604800' | ||||||
|         return locations.pop() |         return locations.pop() | ||||||
|     response.status_code = status.HTTP_404_NOT_FOUND |     response.status_code = status.HTTP_404_NOT_FOUND | ||||||
|     return GeoLocation() |     return GeoLocation() | ||||||
|  |  | ||||||
|  |  | ||||||
| @app.get("/") | @app.get("/") | ||||||
| def root_redirect(req: Request) -> RedirectResponse: | def root_redirect(req: Request) -> RedirectResponse: | ||||||
|     ''' |     ''' | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user