제목에서 알 수 있듯이 Django 사람들은 왜 querydict를 사용하여 request.POST 객체를 구현하기로 결정 했습니까?
게시물 데이터를 복사하여 수정할 수 있다는 것을 알고 있습니다.
post = request.POST.copy()
근데 왜 이렇게? 어쨌든 변경 가능하도록 허용하는 것이 더 간단할까요? 아니면 문제를 일으킬 수있는 다른 이유로도 사용되고 있습니까?
제목에서 알 수 있듯이 Django 사람들은 왜 querydict를 사용하여 request.POST 객체를 구현하기로 결정 했습니까?
게시물 데이터를 복사하여 수정할 수 있다는 것을 알고 있습니다.
post = request.POST.copy()
근데 왜 이렇게? 어쨌든 변경 가능하도록 허용하는 것이 더 간단할까요? 아니면 문제를 일으킬 수있는 다른 이유로도 사용되고 있습니까?
답변:
약간의 미스터리 죠? 표면적으로 그럴듯한 몇 가지 이론이 조사에서 잘못된 것으로 밝혀졌습니다.
그래서 것을 POST
목적은 돌연변이 메소드를 구현하지 않습니다? 아니 다음 POST
객체가 속한 django.http.QueryDict
클래스 돌연변이 방법의 전체 세트를 포함하여 구현, __setitem__
, __delitem__
, pop
와 clear
. 돌연변이 메소드 중 하나를 호출 할 때 플래그를 확인하여 불변성을 구현합니다. copy
메서드 를 호출 QueryDict
하면 변경 가능한 플래그가 설정된 다른 인스턴스가 생성됩니다.
성능 향상을 위해? 아니오 : QueryDict
변경 가능한 플래그가 꺼져있을 때 클래스는 성능 이점을 얻지 못합니다.
있도록 POST
객체는 사전 키로 사용할 수 있습니까? 아니요 : QueryDict
개체는 해시 할 수 없습니다.
그래서 여기에 주장 된 것처럼POST
데이터를 느리게 (전체 응답을 읽지 않고) 작성할 수 있습니까? 나는 코드에서 이것에 대한 증거를 볼 수 없다. 내가 말할 수있는 한, 전체 응답은 항상 직접 또는 응답 을 위해 읽혀진다 .MultiPartParser
multipart
프로그래밍 오류로부터 보호하기 위해? 나는 이것이 주장하는 것을 보았지만 이러한 오류가 무엇인지, 그리고 불변성이 어떻게 당신을 보호하는지에 대한 좋은 설명을 본 적이 없습니다.
어떤 경우 POST
입니다 항상 불변하지 : 응답이있을 때 multipart
, 다음 POST
변경할 수 있습니다. 이것은 당신이 생각할 수있는 대부분의 이론에 키보시를 넣는 것 같습니다. (이 행동이 감독이 아니라면.)
요약하면, Django에서 객체가 비 요청에 대해 변경 불가능 하다는 명확한 근거 를 볼 수 없습니다 .POST
multipart
요청이 Django form
제출 의 결과 인 경우 POST가 양식 제출 과 양식 유효성 검사 사이 의 immutable
데이터 무결성을 보장하는 것이 합리적입니다 . 그러나 요청이 Django 제출을 통해 전송 되지 않은 경우 POST는 양식 유효성 검사가 없기 때문입니다.form
mutable
당신은 항상 다음과 같이 할 수 있습니다 : ( @ leo-the-manic의 코멘트에 따라 )
# .....
mutable = request.POST._mutable
request.POST._mutable = True
request.POST['some_data'] = 'test data'
request.POST._mutable = mutable
# ......
업데이트 :
Gareth Rees는이 경우 포인트 1과 3이 유효하지 않다는 것이 옳았습니다. 2 번과 4 번이 여전히 유효하다고 생각하지만 여기에 논문을 남겨 두겠습니다.
( request.POST
Pyramid (Pylon)과 Django 의 객체가.의 어떤 형태 라는 것을 알아 챘습니다 MultiDict
. 그래서 아마도 request.POST
불변으로 만드는 것보다 더 일반적인 관행 일 것 입니다.)
나는 Django 사람들을 위해 말할 수는 없지만 다음과 같은 이유 때문에 그렇게 할 수 있다고 생각합니다.
QueryDict
Gareth Rees가 지적한경우가 아닙니다.request.POST
서버 측에서 요청 데이터 를 변경해야하는 활동이없는 것 같습니다 . 따라서 불변의 객체는 성능상의 이점이 있다는 것은 말할 것도없고 더 적합합니다.dict
키로 사용될 수 있는데, 장고 어딘가에서 매우 유용 할 수 있다고 생각 합니다. request.POST
(특히 타사 플러그인 및 외부로) 사용자의이 요청 객체가 변경되지 않은 상태로 유지 될 것으로 예상 할 수 있습니다.어떤면에서 이러한 이유는 "불변성 대 가변성?"에 대한 일반적인 대답이기도합니다. 질문. Django의 경우 위의 것보다 훨씬 더 많은 디자인 고려 사항이 있다고 확신합니다.
sessions
가 상태간에 데이터를 가져오고 수정하는 단기적인 방법을 제공 하는 이유 입니다.
POST
이 QueryDict
객체 입니다. 그리고 이러한 객체들은 불변성으로 인한 성능상의 이점을 얻지 못합니다. 그리고 당신의 요점 (3)은 답이 될 수 없습니다. 왜냐하면 QueryDict
객체는 해시 할 수 없기 때문에 사전 키로 사용할 수 없기 때문 입니다.
QueryDict
답장하기 전에 더 많은주의를 기울 였어야 했다.
requests.POST._mutable = True; requests.POST['foo'] = 'bar'; request.POST._mutable = False
Stack Answer https://stackoverflow.com/a/2339963 에 대한 의견에서 이것을 발견했습니다.
그리고 느리게 만들 수 있도록 불변이어야합니다. 복사는 모든 POST 데이터를 가져옵니다. 사본이 나오기 전까지는 모두 가져 오지 못할 수도 있습니다. 또한 다중 스레드 WSGI 서버가 합리적으로 잘 작동하려면 이것이 변경 불가능한 경우 유용합니다.
참고 : multipart
Django 1.11 https://github.com/django/django/blob/stable/1.11.x/django/http/multipartparser.py#L292 부터 요청은 변경할 수 없습니다.
이전 버전에서는 변경 가능했습니다.
request.POST
하면 실제보다 더 많은 데이터가 제출 된 인상을 만들 수 있습니다 .