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
This commit is contained in:
Martin 2022-11-24 14:35:21 +01:00 committed by GitHub
parent 10496553ed
commit 00c9365b5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 0 deletions

View File

@ -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:

View File

@ -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

View File

@ -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),)