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:
parent
9ae4712c29
commit
c8297852ce
@ -1,18 +1,18 @@
|
||||
from __future__ import annotations
|
||||
from pocketbase.services.admins import Admins
|
||||
from pocketbase.stores.base_auth_store import BaseAuthStore
|
||||
from pocketbase.services.settings import Settings
|
||||
from pocketbase.services.users import Users
|
||||
from pocketbase.services.records import Records
|
||||
from pocketbase.services.realtime import Realtime
|
||||
from pocketbase.services.logs import Logs
|
||||
from pocketbase.services.collections import Collections
|
||||
from pocketbase.models import FileUpload
|
||||
|
||||
from typing import Any
|
||||
|
||||
import httpx
|
||||
|
||||
from pocketbase.services.admins import Admins
|
||||
from pocketbase.services.collections import Collections
|
||||
from pocketbase.services.logs import Logs
|
||||
from pocketbase.services.realtime import Realtime
|
||||
from pocketbase.services.records import Records
|
||||
from pocketbase.services.users import Users
|
||||
from pocketbase.services.settings import Settings
|
||||
from pocketbase.stores.base_auth_store import BaseAuthStore
|
||||
|
||||
|
||||
class ClientResponseError(Exception):
|
||||
url: str = ""
|
||||
@ -82,6 +82,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,
|
||||
@ -89,6 +104,8 @@ class Client:
|
||||
params=params,
|
||||
headers=headers,
|
||||
json=body,
|
||||
data=data,
|
||||
files=files,
|
||||
timeout=120,
|
||||
)
|
||||
except Exception as e:
|
||||
|
||||
@ -4,3 +4,4 @@ from .external_auth import ExternalAuth
|
||||
from .log_request import LogRequest
|
||||
from .record import Record
|
||||
from .user import User
|
||||
from .file_upload import FileUpload
|
||||
|
||||
13
pocketbase/models/file_upload.py
Normal file
13
pocketbase/models/file_upload.py
Normal 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),)
|
||||
Loading…
x
Reference in New Issue
Block a user