요청 객체를 수정하는 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
'developer tip' 카테고리의 다른 글
다음 json 문자열을 Java 객체로 변환하는 방법은 무엇입니까? (0) | 2021.01.10 |
---|---|
HTML5 UI 프레임 워크 (0) | 2021.01.10 |
selectize.js 입력 값을 설정하는 방법은 무엇입니까? (0) | 2021.01.10 |
GET 요청을 수행하고 Querystring을 작성하십시오. (0) | 2021.01.09 |
OS의 제한을 초과하여 키 반복률을 높이려면 어떻게해야합니까? (0) | 2021.01.09 |