File tree Expand file tree Collapse file tree 3 files changed +42
-8
lines changed Expand file tree Collapse file tree 3 files changed +42
-8
lines changed Original file line number Diff line number Diff line change @@ -28,13 +28,21 @@ def fix_request_files_middleware(get_response: Any) -> Any:
2828 populated for POST requests.
2929 https://code.djangoproject.com/ticket/12635
3030 """
31+
32+ def should_fix_request_files (request : HttpRequest ) -> bool :
33+ return (
34+ request .method in FIX_METHODS
35+ and request .content_type != "application/json"
36+ and (
37+ ninja_settings .FIX_REQUEST_FILES_URLS is None
38+ or ninja_settings .FIX_REQUEST_FILES_URLS .search (request .path )
39+ )
40+ )
41+
3142 if iscoroutinefunction (get_response ):
3243
3344 async def async_middleware (request : HttpRequest ) -> Any :
34- if (
35- request .method in FIX_METHODS
36- and request .content_type != "application/json"
37- ):
45+ if should_fix_request_files (request ):
3846 initial_method = request .method
3947 request .method = "POST"
4048 request .META ["REQUEST_METHOD" ] = "POST"
@@ -48,10 +56,7 @@ async def async_middleware(request: HttpRequest) -> Any:
4856 else :
4957
5058 def sync_middleware (request : HttpRequest ) -> Any :
51- if (
52- request .method in FIX_METHODS
53- and request .content_type != "application/json"
54- ):
59+ if should_fix_request_files (request ):
5560 initial_method = request .method
5661 request .method = "POST"
5762 request .META ["REQUEST_METHOD" ] = "POST"
Original file line number Diff line number Diff line change 1+ import re
12from math import inf
23from typing import Dict , Optional , Set
34
@@ -29,6 +30,9 @@ class Settings(BaseModel):
2930 FIX_REQUEST_FILES_METHODS : Set [str ] = Field (
3031 {"PUT" , "PATCH" , "DELETE" }, alias = "NINJA_FIX_REQUEST_FILES_METHODS"
3132 )
33+ FIX_REQUEST_FILES_URLS : Optional [re .Pattern ] = Field (
34+ None , alias = "NINJA_FIX_REQUEST_FILES_URLS"
35+ )
3236
3337
3438settings = Settings .model_validate (django_settings )
Original file line number Diff line number Diff line change 1+ import importlib
2+ import re
13from typing import List
24
35import pytest
46from django .core .files .uploadedfile import SimpleUploadedFile
7+ from django .test import override_settings
8+ from django .test .client import MULTIPART_CONTENT
59from django .utils .datastructures import MultiValueDict
610
711from ninja import File , NinjaAPI , UploadedFile
12+ from ninja .compatibility .files import fix_request_files_middleware
813from ninja .errors import ConfigError
914from ninja .testing import TestClient
1015
@@ -144,3 +149,23 @@ def test_files_fix_middleware():
144149 @api .patch ("/file1" )
145150 def patch_with_file (request , file : UploadedFile ):
146151 return {"name" : file .name }
152+
153+
154+ @override_settings (NINJA_FIX_REQUEST_FILES_URLS = re .compile (r"^/file\d+" ))
155+ def test_files_fix_middleware_urls (rf ):
156+ def get_response (request ):
157+ assert request .FILES == {}
158+
159+ from ninja import conf
160+ from ninja .compatibility import files
161+
162+ importlib .reload (conf )
163+ importlib .reload (files )
164+
165+ file = SimpleUploadedFile ("test.txt" , b"data123" )
166+ post_data = rf ._encode_data ({"file" : file }, MULTIPART_CONTENT )
167+ request = rf .generic (
168+ "PATCH" , "/not-patched" , post_data , content_type = MULTIPART_CONTENT
169+ )
170+
171+ fix_request_files_middleware (get_response )(request )
You can’t perform that action at this time.
0 commit comments