From 00c9365b5f03107da06f51f5c95354a96e9dfaf4 Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 24 Nov 2022 14:35:21 +0100 Subject: [PATCH] Port of PR #6 to branch 0.8.0 (#7) * Switch from JSON to multipart file encoding for file upload File upload is detected when body data contains a value of class FileUpload Remaining JSON is converted to FormData Enitre message is sent as multipart * Switch from JSON to multipart file encoding for file upload (#6) File upload is detected when body data contains a value of class FileUpload Remaining JSON is converted to FormData Enitre message is sent as multipart --- pocketbase/client.py | 19 +++++++++++++++++++ pocketbase/models/__init__.py | 1 + pocketbase/models/file_upload.py | 13 +++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 pocketbase/models/file_upload.py diff --git a/pocketbase/client.py b/pocketbase/client.py index 9fe6e8d..d3b041a 100644 --- a/pocketbase/client.py +++ b/pocketbase/client.py @@ -1,4 +1,6 @@ from __future__ import annotations +from pocketbase.stores.base_auth_store import BaseAuthStore +from pocketbase.models import FileUpload from typing import Any, Dict from urllib.parse import quote, urlencode @@ -71,6 +73,21 @@ class Client: params = config.get("params", None) headers = config.get("headers", None) body = config.get("body", None) + # handle requests including files as multipart: + data = {} + files = () + for k, v in (body if isinstance(body, dict) else {}).items(): + if isinstance(v, FileUpload): + files += v.get(k) + else: + data[k] = v + if len(files) > 0: + # discard body, switch to multipart encoding + body = None + else: + # discard files+data (do not use multipart encoding) + files = None + data = None try: response = httpx.request( method=method, @@ -78,6 +95,8 @@ class Client: params=params, headers=headers, json=body, + data=data, + files=files, timeout=120, ) except Exception as e: diff --git a/pocketbase/models/__init__.py b/pocketbase/models/__init__.py index 71db03c..4e31d92 100644 --- a/pocketbase/models/__init__.py +++ b/pocketbase/models/__init__.py @@ -3,3 +3,4 @@ from .collection import Collection from .external_auth import ExternalAuth from .log_request import LogRequest from .record import Record +from .file_upload import FileUpload diff --git a/pocketbase/models/file_upload.py b/pocketbase/models/file_upload.py new file mode 100644 index 0000000..3e5eda7 --- /dev/null +++ b/pocketbase/models/file_upload.py @@ -0,0 +1,13 @@ +from httpx._types import FileTypes +from typing import Sequence, Union +FileUploadTypes = Union[FileTypes, Sequence[FileTypes]] + + +class FileUpload: + def __init__(self, *args): + self.files: FileUploadTypes = args + + def get(self, key: str): + if isinstance(self.files[0], Sequence): + return tuple((key, i) for i in self.files) + return ((key, self.files),)