From 7b1e11192790a4ae80ad65a896b375e16da7b177 Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Wed, 10 May 2023 18:18:58 +0300 Subject: [PATCH 01/14] json encoder --- flask_mongoengine/json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_mongoengine/json.py b/flask_mongoengine/json.py index 83637632..514bac6b 100644 --- a/flask_mongoengine/json.py +++ b/flask_mongoengine/json.py @@ -78,7 +78,7 @@ def default(obj): (BaseDocument, QuerySet, CommandCursor, DBRef, ObjectId), ): return _convert_mongo_objects(obj) - return super().default(obj) + return superclass.default(obj) return MongoEngineJSONProvider From 565f2aa1398447cfb5fb742b71f601e399a876a0 Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Sat, 13 May 2023 20:21:02 +0300 Subject: [PATCH 02/14] json encoder doc --- docs/custom_json_encoder.md | 27 +++++++++++++++++++++++++++ docs/index.rst | 1 + 2 files changed, 28 insertions(+) create mode 100644 docs/custom_json_encoder.md diff --git a/docs/custom_json_encoder.md b/docs/custom_json_encoder.md new file mode 100644 index 00000000..0c8dd0f5 --- /dev/null +++ b/docs/custom_json_encoder.md @@ -0,0 +1,27 @@ +# Custom Json Encoder + +flask-mongoengine have option to add custom encoder for flask +By this way you can handel encoding special object + + +Examples: + +```python +from flask_mongoengine.json import MongoEngineJSONProvider +class CustomJSONEncoder(MongoEngineJSONProvider): + @staticmethod + def default(obj): + if isinstance(obj, set): + return list(obj) + if isinstance(obj, Decimal128): + return str(obj) + return MongoEngineJSONProvider.default(obj) + + +# Tell your flask app to use your customised JSON encoder + + +app.json_provider_class = CustomJSONEncoder +app.json = app.json_provider_class(app) + +``` diff --git a/docs/index.rst b/docs/index.rst index 625bdb50..c305b72f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,6 +15,7 @@ You can also use `WTForms `_ as model forms for forms migration_to_v2 custom_queryset + custom_json_encoder wtf_forms session_interface debug_toolbar From 8ec07dfe119dcc775f20db70ab2cb92b61b73235 Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Wed, 24 May 2023 16:59:11 +0300 Subject: [PATCH 03/14] select_related should not be by default --- flask_mongoengine/pagination.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flask_mongoengine/pagination.py b/flask_mongoengine/pagination.py index 01b8b2ea..79df2997 100644 --- a/flask_mongoengine/pagination.py +++ b/flask_mongoengine/pagination.py @@ -8,7 +8,7 @@ class Pagination(object): - def __init__(self, iterable, page, per_page): + def __init__(self, iterable, page, per_page, max_depth=None): if page < 1: abort(404) @@ -24,6 +24,8 @@ def __init__(self, iterable, page, per_page): .limit(self.per_page) .select_related() ) + if max_depth is not None: + self.items.select_related(max_depth) else: start_index = (page - 1) * per_page end_index = page * per_page From ba3d8da83eda7679917606b4518459e2955683fa Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Wed, 24 May 2023 16:59:24 +0300 Subject: [PATCH 04/14] select_related should not be by default --- flask_mongoengine/pagination.py | 1 - 1 file changed, 1 deletion(-) diff --git a/flask_mongoengine/pagination.py b/flask_mongoengine/pagination.py index 79df2997..372525e7 100644 --- a/flask_mongoengine/pagination.py +++ b/flask_mongoengine/pagination.py @@ -22,7 +22,6 @@ def __init__(self, iterable, page, per_page, max_depth=None): self.items = ( self.iterable.skip(self.per_page * (self.page - 1)) .limit(self.per_page) - .select_related() ) if max_depth is not None: self.items.select_related(max_depth) From 2a23a735ba54215850e9f041b924473f7ef4725e Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Wed, 24 May 2023 16:59:51 +0300 Subject: [PATCH 05/14] select_related should not be by default --- flask_mongoengine/pagination.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_mongoengine/pagination.py b/flask_mongoengine/pagination.py index 372525e7..c24991ca 100644 --- a/flask_mongoengine/pagination.py +++ b/flask_mongoengine/pagination.py @@ -24,7 +24,7 @@ def __init__(self, iterable, page, per_page, max_depth=None): .limit(self.per_page) ) if max_depth is not None: - self.items.select_related(max_depth) + self.items = self.items.select_related(max_depth) else: start_index = (page - 1) * per_page end_index = page * per_page From 2877b70d26fb6b82d80d676e25077836fb2d3fa2 Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Thu, 25 May 2023 14:25:39 +0300 Subject: [PATCH 06/14] usage of abort without error message is really confused --- flask_mongoengine/exceptions.py | 6 ++++++ flask_mongoengine/pagination.py | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 flask_mongoengine/exceptions.py diff --git a/flask_mongoengine/exceptions.py b/flask_mongoengine/exceptions.py new file mode 100644 index 00000000..a99d4d8c --- /dev/null +++ b/flask_mongoengine/exceptions.py @@ -0,0 +1,6 @@ +from werkzeug.exceptions import HTTPException + + +class InvalidPage(HTTPException): + code = 404 + description = 'Invalid page number.' diff --git a/flask_mongoengine/pagination.py b/flask_mongoengine/pagination.py index c24991ca..6ac658a7 100644 --- a/flask_mongoengine/pagination.py +++ b/flask_mongoengine/pagination.py @@ -1,7 +1,7 @@ """Module responsible for custom pagination.""" import math -from flask import abort +from flask_mongoengine.exceptions import InvalidPage from mongoengine.queryset import QuerySet __all__ = ("Pagination", "ListFieldPagination") @@ -11,7 +11,7 @@ class Pagination(object): def __init__(self, iterable, page, per_page, max_depth=None): if page < 1: - abort(404) + raise InvalidPage self.iterable = iterable self.page = page @@ -32,7 +32,7 @@ def __init__(self, iterable, page, per_page, max_depth=None): self.total = len(iterable) self.items = iterable[start_index:end_index] if not self.items and page != 1: - abort(404) + raise InvalidPage @property def pages(self): @@ -134,7 +134,7 @@ def __init__(self, queryset, doc_id, field_name, page, per_page, total=None): elsewhere, but we still use array.length as a fallback. """ if page < 1: - abort(404) + raise InvalidPage self.page = page self.per_page = per_page @@ -154,7 +154,7 @@ def __init__(self, queryset, doc_id, field_name, page, per_page, total=None): ) if not self.items and page != 1: - abort(404) + raise InvalidPage def prev(self, error_out=False): """Returns a :class:`Pagination` object for the previous page.""" From 3b06516a5cbf9c6bc3b825ddb2d2395eb43bdbc4 Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Fri, 26 May 2023 19:41:51 +0300 Subject: [PATCH 07/14] tester for pagination --- docs/custom_json_encoder.md | 1 - flask_mongoengine/exceptions.py | 2 +- flask_mongoengine/pagination.py | 8 +++---- tests/test_json.py | 2 +- tests/test_pagination.py | 41 ++++++++++++++++++++++++++------- 5 files changed, 39 insertions(+), 15 deletions(-) diff --git a/docs/custom_json_encoder.md b/docs/custom_json_encoder.md index 0c8dd0f5..40c30ede 100644 --- a/docs/custom_json_encoder.md +++ b/docs/custom_json_encoder.md @@ -3,7 +3,6 @@ flask-mongoengine have option to add custom encoder for flask By this way you can handel encoding special object - Examples: ```python diff --git a/flask_mongoengine/exceptions.py b/flask_mongoengine/exceptions.py index a99d4d8c..b523b311 100644 --- a/flask_mongoengine/exceptions.py +++ b/flask_mongoengine/exceptions.py @@ -3,4 +3,4 @@ class InvalidPage(HTTPException): code = 404 - description = 'Invalid page number.' + description = "Invalid page number." diff --git a/flask_mongoengine/pagination.py b/flask_mongoengine/pagination.py index 6ac658a7..9946b588 100644 --- a/flask_mongoengine/pagination.py +++ b/flask_mongoengine/pagination.py @@ -1,9 +1,10 @@ """Module responsible for custom pagination.""" import math -from flask_mongoengine.exceptions import InvalidPage from mongoengine.queryset import QuerySet +from flask_mongoengine.exceptions import InvalidPage + __all__ = ("Pagination", "ListFieldPagination") @@ -19,9 +20,8 @@ def __init__(self, iterable, page, per_page, max_depth=None): if isinstance(self.iterable, QuerySet): self.total = iterable.count() - self.items = ( - self.iterable.skip(self.per_page * (self.page - 1)) - .limit(self.per_page) + self.items = self.iterable.skip(self.per_page * (self.page - 1)).limit( + self.per_page ) if max_depth is not None: self.items = self.items.select_related(max_depth) diff --git a/tests/test_json.py b/tests/test_json.py index 73b7de28..75623cfd 100644 --- a/tests/test_json.py +++ b/tests/test_json.py @@ -41,7 +41,7 @@ def extended_db(app): test_db.connection["default"].drop_database(db_name) -class DummyEncoder(flask.json.JSONEncoder): +class DummyEncoder(flask.json._json.JSONEncoder): """ An example encoder which a user may create and override the apps json_encoder with. diff --git a/tests/test_pagination.py b/tests/test_pagination.py index e9d3f4fe..c32143ac 100644 --- a/tests/test_pagination.py +++ b/tests/test_pagination.py @@ -1,18 +1,30 @@ +import flask import pytest -from werkzeug.exceptions import NotFound from flask_mongoengine import ListFieldPagination, Pagination +from flask_mongoengine.exceptions import InvalidPage -def test_queryset_paginator(app, todo): +@pytest.fixture(autouse=True) +def setup_endpoints(app, todo): Todo = todo for i in range(42): Todo(title=f"post: {i}").save() - with pytest.raises(NotFound): + @app.route("/") + def index(): + page = int(flask.request.form.get("page")) + per_page = int(flask.request.form.get("per_page")) + return Pagination(iterable=Todo.objects, page=page, per_page=per_page) + + +def test_queryset_paginator(app, todo): + Todo = todo + + with pytest.raises(InvalidPage): Pagination(iterable=Todo.objects, page=0, per_page=10) - with pytest.raises(NotFound): + with pytest.raises(InvalidPage): Pagination(iterable=Todo.objects, page=6, per_page=10) paginator = Pagination(Todo.objects, 1, 10) @@ -26,10 +38,10 @@ def test_queryset_paginator(app, todo): def test_paginate_plain_list(): - with pytest.raises(NotFound): + with pytest.raises(InvalidPage): Pagination(iterable=range(1, 42), page=0, per_page=10) - with pytest.raises(NotFound): + with pytest.raises(InvalidPage): Pagination(iterable=range(1, 42), page=6, per_page=10) paginator = Pagination(range(1, 42), 1, 10) @@ -68,14 +80,14 @@ def _test_paginator(paginator): if i == 1: assert not paginator.has_prev - with pytest.raises(NotFound): + with pytest.raises(InvalidPage): paginator.prev() else: assert paginator.has_prev if i == 5: assert not paginator.has_next - with pytest.raises(NotFound): + with pytest.raises(InvalidPage): paginator.next() else: assert paginator.has_next @@ -90,3 +102,16 @@ def _test_paginator(paginator): # Paginate to the next page if i < 5: paginator = paginator.next() + + +def test_flask_pagination(app, todo): + client = app.test_client() + response = client.get(f"/", data={"page": 0, "per_page": 10}) + print(response.status_code) + assert response.status_code == 404 + assert "Invalid page number" in response.text + + response = client.get(f"/", data={"page": 6, "per_page": 10}) + print(response.status_code) + assert response.status_code == 404 + assert "Invalid page number" in response.text From 68aa4fbf3fc2a1102ba70125b021c1bd4616354f Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Mon, 29 May 2023 16:38:24 +0300 Subject: [PATCH 08/14] revert --- flask_mongoengine/exceptions.py | 6 ------ flask_mongoengine/pagination.py | 10 +++++----- 2 files changed, 5 insertions(+), 11 deletions(-) delete mode 100644 flask_mongoengine/exceptions.py diff --git a/flask_mongoengine/exceptions.py b/flask_mongoengine/exceptions.py deleted file mode 100644 index b523b311..00000000 --- a/flask_mongoengine/exceptions.py +++ /dev/null @@ -1,6 +0,0 @@ -from werkzeug.exceptions import HTTPException - - -class InvalidPage(HTTPException): - code = 404 - description = "Invalid page number." diff --git a/flask_mongoengine/pagination.py b/flask_mongoengine/pagination.py index 9946b588..40c267ac 100644 --- a/flask_mongoengine/pagination.py +++ b/flask_mongoengine/pagination.py @@ -1,9 +1,9 @@ """Module responsible for custom pagination.""" import math +from flask import abort, make_response, jsonify from mongoengine.queryset import QuerySet -from flask_mongoengine.exceptions import InvalidPage __all__ = ("Pagination", "ListFieldPagination") @@ -12,7 +12,7 @@ class Pagination(object): def __init__(self, iterable, page, per_page, max_depth=None): if page < 1: - raise InvalidPage + abort(404) self.iterable = iterable self.page = page @@ -32,7 +32,7 @@ def __init__(self, iterable, page, per_page, max_depth=None): self.total = len(iterable) self.items = iterable[start_index:end_index] if not self.items and page != 1: - raise InvalidPage + abort(404) @property def pages(self): @@ -134,7 +134,7 @@ def __init__(self, queryset, doc_id, field_name, page, per_page, total=None): elsewhere, but we still use array.length as a fallback. """ if page < 1: - raise InvalidPage + abort(404) self.page = page self.per_page = per_page @@ -154,7 +154,7 @@ def __init__(self, queryset, doc_id, field_name, page, per_page, total=None): ) if not self.items and page != 1: - raise InvalidPage + abort(404) def prev(self, error_out=False): """Returns a :class:`Pagination` object for the previous page.""" From 6ef6c28bed3d4369368d537766c4fab40d605637 Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Mon, 29 May 2023 16:38:38 +0300 Subject: [PATCH 09/14] revert --- flask_mongoengine/pagination.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask_mongoengine/pagination.py b/flask_mongoengine/pagination.py index 40c267ac..46f38dbc 100644 --- a/flask_mongoengine/pagination.py +++ b/flask_mongoengine/pagination.py @@ -1,6 +1,6 @@ """Module responsible for custom pagination.""" import math -from flask import abort, make_response, jsonify +from flask import abort from mongoengine.queryset import QuerySet From d656328318b209a1420c74802db9d9a42e060ad0 Mon Sep 17 00:00:00 2001 From: idoshr <35264146+idoshr@users.noreply.github.com> Date: Mon, 29 May 2023 16:39:06 +0300 Subject: [PATCH 10/14] Update docs/custom_json_encoder.md Co-authored-by: Andrey Shpak --- docs/custom_json_encoder.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/custom_json_encoder.md b/docs/custom_json_encoder.md index 40c30ede..e382fb07 100644 --- a/docs/custom_json_encoder.md +++ b/docs/custom_json_encoder.md @@ -1,7 +1,7 @@ # Custom Json Encoder flask-mongoengine have option to add custom encoder for flask -By this way you can handel encoding special object +By this way you can handle encoding special object Examples: From dbd3bbfd09cd160c19c70f9a0e0f580d311b3726 Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Mon, 29 May 2023 18:18:31 +0300 Subject: [PATCH 11/14] DOC And revert tester --- docs/custom_queryset.md | 3 ++- flask_mongoengine/pagination.py | 13 +++++++++--- tests/test_pagination.py | 36 +++++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/docs/custom_queryset.md b/docs/custom_queryset.md index f011b79c..0abcbb1f 100644 --- a/docs/custom_queryset.md +++ b/docs/custom_queryset.md @@ -6,7 +6,8 @@ flask-mongoengine attaches the following methods to Mongoengine's default QueryS Optional arguments: *message* - custom message to display. * **first_or_404**: same as above, except for .first(). Optional arguments: *message* - custom message to display. -* **paginate**: paginates the QuerySet. Takes two arguments, *page* and *per_page*. +* **paginate**: paginates the QuerySet. Takes two required arguments, *page* and *per_page*. + And one optional arguments *max_depth*. * **paginate_field**: paginates a field from one document in the QuerySet. Arguments: *field_name*, *doc_id*, *page*, *per_page*. diff --git a/flask_mongoengine/pagination.py b/flask_mongoengine/pagination.py index 46f38dbc..22be2a1a 100644 --- a/flask_mongoengine/pagination.py +++ b/flask_mongoengine/pagination.py @@ -1,15 +1,22 @@ """Module responsible for custom pagination.""" import math -from flask import abort +from flask import abort from mongoengine.queryset import QuerySet - __all__ = ("Pagination", "ListFieldPagination") class Pagination(object): - def __init__(self, iterable, page, per_page, max_depth=None): + def __init__(self, iterable, page: int, per_page: int, max_depth: int = None): + """ + :param iterable: iterable object . + :param page: Required page number start from 1. + :param per_page: Required number of documents per page. + :param max_depth: Option for limit number of dereference documents. + + + """ if page < 1: abort(404) diff --git a/tests/test_pagination.py b/tests/test_pagination.py index c32143ac..7578e533 100644 --- a/tests/test_pagination.py +++ b/tests/test_pagination.py @@ -1,8 +1,7 @@ import flask import pytest - +from werkzeug.exceptions import NotFound from flask_mongoengine import ListFieldPagination, Pagination -from flask_mongoengine.exceptions import InvalidPage @pytest.fixture(autouse=True) @@ -15,16 +14,20 @@ def setup_endpoints(app, todo): def index(): page = int(flask.request.form.get("page")) per_page = int(flask.request.form.get("per_page")) - return Pagination(iterable=Todo.objects, page=page, per_page=per_page) + query_set = Todo.objects().paginate(page=page, per_page=per_page) + return {'data': [_ for _ in query_set.items], + 'total': query_set.total, + 'has_next': query_set.has_next, + } def test_queryset_paginator(app, todo): Todo = todo - with pytest.raises(InvalidPage): + with pytest.raises(NotFound): Pagination(iterable=Todo.objects, page=0, per_page=10) - with pytest.raises(InvalidPage): + with pytest.raises(NotFound): Pagination(iterable=Todo.objects, page=6, per_page=10) paginator = Pagination(Todo.objects, 1, 10) @@ -38,10 +41,10 @@ def test_queryset_paginator(app, todo): def test_paginate_plain_list(): - with pytest.raises(InvalidPage): + with pytest.raises(NotFound): Pagination(iterable=range(1, 42), page=0, per_page=10) - with pytest.raises(InvalidPage): + with pytest.raises(NotFound): Pagination(iterable=range(1, 42), page=6, per_page=10) paginator = Pagination(range(1, 42), 1, 10) @@ -80,14 +83,14 @@ def _test_paginator(paginator): if i == 1: assert not paginator.has_prev - with pytest.raises(InvalidPage): + with pytest.raises(NotFound): paginator.prev() else: assert paginator.has_prev if i == 5: assert not paginator.has_next - with pytest.raises(InvalidPage): + with pytest.raises(NotFound): paginator.next() else: assert paginator.has_next @@ -109,9 +112,20 @@ def test_flask_pagination(app, todo): response = client.get(f"/", data={"page": 0, "per_page": 10}) print(response.status_code) assert response.status_code == 404 - assert "Invalid page number" in response.text response = client.get(f"/", data={"page": 6, "per_page": 10}) print(response.status_code) assert response.status_code == 404 - assert "Invalid page number" in response.text + + +def test_flask_pagination_next(app, todo): + client = app.test_client() + has_next = True + page = 1 + while has_next: + response = client.get(f"/", data={"page": page, "per_page": 10}) + print(response.status_code) + print(response.json) + assert response.status_code == 200 + has_next = response.json['has_next'] + page += 1 From 9e25240a50bfea32070f65ea99e1be5851856bf5 Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Mon, 29 May 2023 18:19:40 +0300 Subject: [PATCH 12/14] test --- tests/test_pagination.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_pagination.py b/tests/test_pagination.py index 7578e533..668093b5 100644 --- a/tests/test_pagination.py +++ b/tests/test_pagination.py @@ -124,8 +124,6 @@ def test_flask_pagination_next(app, todo): page = 1 while has_next: response = client.get(f"/", data={"page": page, "per_page": 10}) - print(response.status_code) - print(response.json) assert response.status_code == 200 has_next = response.json['has_next'] page += 1 From 20f00001c4e2cbd9666c33f14be70c5f6ba184ef Mon Sep 17 00:00:00 2001 From: Ido Shraga Date: Sat, 3 Jun 2023 18:43:10 +0300 Subject: [PATCH 13/14] fix flask2.3 issue --- flask_mongoengine/sessions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flask_mongoengine/sessions.py b/flask_mongoengine/sessions.py index 756359ee..2a8df49d 100644 --- a/flask_mongoengine/sessions.py +++ b/flask_mongoengine/sessions.py @@ -56,7 +56,7 @@ def get_expiration_time(self, app, session) -> timedelta: return timedelta(**app.config.get("SESSION_TTL", {"days": 1})) def open_session(self, app, request): - sid = request.cookies.get(app.session_cookie_name) + sid = request.cookies.get(app.config["SESSION_COOKIE_NAME"]) if sid: stored_session = self.cls.objects(sid=sid).first() @@ -81,7 +81,7 @@ def save_session(self, app, session, response): # If the session is empty, return without setting the cookie. if not session: if session.modified: - response.delete_cookie(app.session_cookie_name, domain=domain) + response.delete_cookie(app.config["SESSION_COOKIE_NAME"], domain=domain) return expiration = datetime.utcnow().replace(tzinfo=utc) + self.get_expiration_time( @@ -92,7 +92,7 @@ def save_session(self, app, session, response): self.cls(sid=session.sid, data=session, expiration=expiration).save() response.set_cookie( - app.session_cookie_name, + app.config["SESSION_COOKIE_NAME"], session.sid, expires=expiration, httponly=httponly, From ddb41460e801c737bba8f7031485a9482c7361b9 Mon Sep 17 00:00:00 2001 From: Sourcery AI <> Date: Sat, 3 Jun 2023 15:43:26 +0000 Subject: [PATCH 14/14] 'Refactored by Sourcery' --- tests/test_pagination.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/test_pagination.py b/tests/test_pagination.py index 668093b5..b91e135b 100644 --- a/tests/test_pagination.py +++ b/tests/test_pagination.py @@ -15,10 +15,11 @@ def index(): page = int(flask.request.form.get("page")) per_page = int(flask.request.form.get("per_page")) query_set = Todo.objects().paginate(page=page, per_page=per_page) - return {'data': [_ for _ in query_set.items], - 'total': query_set.total, - 'has_next': query_set.has_next, - } + return { + 'data': list(query_set.items), + 'total': query_set.total, + 'has_next': query_set.has_next, + } def test_queryset_paginator(app, todo): @@ -109,11 +110,11 @@ def _test_paginator(paginator): def test_flask_pagination(app, todo): client = app.test_client() - response = client.get(f"/", data={"page": 0, "per_page": 10}) + response = client.get("/", data={"page": 0, "per_page": 10}) print(response.status_code) assert response.status_code == 404 - response = client.get(f"/", data={"page": 6, "per_page": 10}) + response = client.get("/", data={"page": 6, "per_page": 10}) print(response.status_code) assert response.status_code == 404 @@ -123,7 +124,7 @@ def test_flask_pagination_next(app, todo): has_next = True page = 1 while has_next: - response = client.get(f"/", data={"page": page, "per_page": 10}) + response = client.get("/", data={"page": page, "per_page": 10}) assert response.status_code == 200 has_next = response.json['has_next'] page += 1