Skip to content

Commit 1745cee

Browse files
authored
Merge pull request #17 from a-luna/patch-release/v0.1.3
Patch release/v0.1.3
2 parents 0a7f1a6 + 84229c5 commit 1745cee

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

README.md

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
1-
# `fastapi-redis-cache`
1+
## `fastapi-redis-cache`
22

3-
[![PyPI version](https://badge.fury.io/py/fastapi-redis-cache.svg)](https://badge.fury.io/py/fastapi-redis-cache) ![PyPI - Downloads](https://img.shields.io/pypi/dm/fastapi-redis-cache?color=%234DC71F) ![PyPI - License](https://img.shields.io/pypi/l/fastapi-redis-cache?color=%25234DC71F) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/fastapi-redis-cache) [![Maintainability](https://api.codeclimate.com/v1/badges/ec0b1d7afb21bd8c23dc/maintainability)](https://codeclimate.com/github/a-luna/fastapi-redis-cache/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/ec0b1d7afb21bd8c23dc/test_coverage)](https://codeclimate.com/github/a-luna/fastapi-redis-cache/test_coverage)
3+
[![PyPI version](https://badge.fury.io/py/fastapi-redis-cache.svg)](https://badge.fury.io/py/fastapi-redis-cache)
4+
![PyPI - Downloads](https://img.shields.io/pypi/dm/fastapi-redis-cache?color=%234DC71F)
5+
![PyPI - License](https://img.shields.io/pypi/l/fastapi-redis-cache?color=%25234DC71F)
6+
![PyPI - Python Version](https://img.shields.io/pypi/pyversions/fastapi-redis-cache)
7+
[![Maintainability](https://api.codeclimate.com/v1/badges/ec0b1d7afb21bd8c23dc/maintainability)](https://codeclimate.com/github/a-luna/fastapi-redis-cache/maintainability)
8+
[![Test Coverage](https://api.codeclimate.com/v1/badges/ec0b1d7afb21bd8c23dc/test_coverage)](https://codeclimate.com/github/a-luna/fastapi-redis-cache/test_coverage)
9+
10+
### Features
411

512
- Cache response data for async and non-async path operation functions.
6-
- Response data is only cached for `GET` operations, applying `@cache` decorator to path functions for other HTTP method types will have no effect.
713
- Lifetime of cached data is configured separately for each API endpoint.
8-
- Requests with `Cache-Control` header containing `no-cache` or `no-store`are handled correctly (all caching behavior is disabled).
14+
- Requests with `Cache-Control` header containing `no-cache` or `no-store` are handled correctly (all caching behavior is disabled).
915
- Requests with `If-None-Match` header will receive a response with status `304 NOT MODIFIED` if `ETag` for requested resource matches header value.
1016

11-
## Installation
17+
### Installation
1218

1319
`pip install fastapi-redis-cache`
1420

15-
## Usage
21+
### Usage
1622

17-
### Initialize Redis
23+
#### Initialize Redis
1824

1925
Create a `FastApiRedisCache` instance when your application starts by [defining an event handler for the `"startup"` event](https://fastapi.tiangolo.com/advanced/events/) as shown below:
2026

@@ -48,9 +54,9 @@ After creating the instance, you must call the `init` method. The only required
4854
- `ignore_arg_types` (`List[Type[object]]`) — Cache keys are created (in part) by combining the name and value of each argument used to invoke a path operation function. If any of the arguments have no effect on the response (such as a `Request` or `Response` object), including their type in this list will ignore those arguments when the key is created. (_Optional_, defaults to `[Request, Response]`)
4955
- The example shown here includes the `sqlalchemy.orm.Session` type, if your project uses SQLAlchemy as a dependency ([as demonstrated in the FastAPI docs](https://fastapi.tiangolo.com/tutorial/sql-databases/)), you should include `Session` in `ignore_arg_types` in order for cache keys to be created correctly ([More info](#cache-keys)).
5056

51-
### `@cache` Decorator
57+
#### `@cache` Decorator
5258

53-
Decorating a path function with `@cache` enables caching for the endpoint. If no arguments are provided, responses will be set to expire after 1 year, which, historically, is the correct way to mark data that "never expires".
59+
Decorating a path function with `@cache` enables caching for the endpoint. **Response data is only cached for `GET` operations**, decorating path functions for other HTTP method types will have no effect. If no arguments are provided, responses will be set to expire after 1 year, which, historically, is the correct way to mark data that "never expires".
5460

5561
```python
5662
# WILL NOT be cached
@@ -87,7 +93,7 @@ def get_dynamic_data(request: Request, response: Response):
8793
return {"success": True, "message": "this data should only be cached temporarily"}
8894
```
8995

90-
### Response Headers
96+
#### Response Headers
9197

9298
Below is the HTTP response for the `/dynamic_data` endpoint. The `cache-control`, `etag`, `expires`, and `x-fastapi-cache` headers are added because of the `@cache` decorator:
9399

@@ -117,9 +123,9 @@ If this request was made from a web browser, and a request for the same resource
117123

118124
Similarly, if a request is sent with the `cache-control` header containing `no-cache` or `no-store`, all caching behavior will be disabled and the response will be generated and sent as if endpoint had not been decorated with `@cache`.
119125

120-
### Cache Keys
126+
#### Cache Keys
121127

122-
Consider the `/get_item` API route defined below. This is the first path function we have seen where the response depends on the value of an argument (`user_id: int`). This is a typical CRUD operation where `user_id` is used to retrieve a `User` record from a SQLAlchemy database.
128+
Consider the `/get_user` API route defined below. This is the first path function we have seen where the response depends on the value of an argument (`user_id: int`). This is a typical CRUD operation where `user_id` is used to retrieve a `User` record from a SQLAlchemy database.
123129

124130
```python
125131
@app.get("/get_user", response_model=schemas.User)
@@ -177,6 +183,6 @@ INFO:fastapi_redis_cache.client: 04/23/2021 07:04:12 PM | KEY_FOUND_IN_CACHE: ke
177183
INFO: 127.0.0.1:50761 - "GET /get_user?user_id=1 HTTP/1.1" 200 OK
178184
```
179185

180-
## Questions/Contributions
186+
### Questions/Contributions
181187

182188
If you have any questions, please open an issue. Any suggestions and contributions are absolutely welcome. This is still a very small and young project, I plan on adding a feature roadmap and further documentation in the near future.

src/fastapi_redis_cache/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,10 @@ def serialize_json(json_dict: Dict) -> str:
152152

153153
@staticmethod
154154
def get_etag(cached_data: Union[str, Dict]) -> str:
155-
if isinstance(cached_data, dict):
156-
cached_data = serialize_json(cached_data)
157155
if isinstance(cached_data, bytes):
158156
cached_data = cached_data.decode()
157+
if not isinstance(cached_data, str):
158+
cached_data = serialize_json(cached_data)
159159
return f"W/{hash(cached_data)}"
160160

161161
@staticmethod

0 commit comments

Comments
 (0)