developer tip

요청 객체를 수정하는 django

copycodes 2021. 1. 10. 17:27
반응형

요청 객체를 수정하는 django


이미 django 프로젝트가 있으며 다음과 같이 논리적입니다.

URL : URL? username = name & pwd = passwd

전망:

def func(request):
   dic = request.GET

   username = dic.get("username")
   pwd = dic.get("pwd")

하지만 이제 데이터를 암호화해야합니다. 그런 다음 요청은 다음과 같습니다.

url : URL? crypt = XXXXXXXXXX (XXXXXXXX는 "username = name & pwd = passwd"에 대해 암호화 된 str입니다)

그래서 모든 뷰 기능을 수정해야합니다. 하지만 이제는 모든 뷰 기능을 수정하지 못하도록 django 미들웨어에서 해독을 원합니다.

하지만 request.GET을 수정하면 "This QueryDict instance is immutable"오류 메시지가 나타납니다. 어떻게 수정할 수 있습니까?


django.http.QueryDict에 할당 된 개체 request.GET와는 request.POST불변이다.

QueryDict복사 하여 변경 가능한 인스턴스 로 변환 할 수 있습니다 .

request.GET = request.GET.copy()

나중에 다음을 수정할 수 있습니다 QueryDict.

>>> from django.test.client import RequestFactory
>>> request = RequestFactory().get('/')
>>> request.GET
<QueryDict: {}>
>>> request.GET['foo'] = 'bar'
AttributeError: This QueryDict instance is immutable
>>> request.GET = request.GET.copy()
<QueryDict: {}>
>>> request.GET['foo'] = 'bar'
>>> request.GET
<QueryDict: {'foo': 'bar'}>

이것은 응용 프로그램 구성 요소 중 어떤 것도 소스 요청 데이터를 편집 할 수 없도록 의도적으로 설계되었으므로 변경 불가능한 항목을 QueryDict다시 생성해도이 설계가 깨질 수 있습니다. request소스를 편집 할 수 있다는 사실에도 불구하고 지침을 따르고 미들웨어 객체에 직접 추가 요청 데이터를 할당하는 것이 좋습니다 .


불변성 제거 :

if not request.GET._mutable:
   request.GET._mutable = True

# now you can spoil it
request.GET['pwd'] = 'iloveyou'

최신 정보

Django 승인 방식은 request.GET.copy () 입니다.

문서 에 따르면 :

request.POST 및 request.GET의 QueryDict는 일반 요청 / 응답주기에서 액세스 할 때 변경되지 않습니다. 변경 가능한 버전을 얻으려면 QueryDict.copy ()를 사용해야합니다.

향후 Django 버전이 _mutable 을 사용할 것이라는 보장은 없습니다 . 이것은 copy () 메서드 보다 변경 가능성이 더 많습니다 .


GET을 사용하여 사용자 이름과 암호를 보내서는 안됩니다. 이는 URL 표시 줄에 정보를 표시하고 보안 위험을 초래할 수 있기 때문에 나쁜 습관 입니다. 대신 POST를 사용하십시오. 또한 사용자를 인증하려고 시도하고 있으며 문서 에서 예제를 가져 오기 위해 완전히 내장 된 것을 처리하기 위해 너무 많은 작업 (새 미들웨어 생성)을 수행하고있는 것 같습니다 .

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

저도 사용하기 매우 간단한 login_required 데코레이터를 사용하는 것을 정말 좋아 합니다. 도움이되는 희망

ReferenceURL : https://stackoverflow.com/questions/18930234/django-modifying-the-request-object

반응형