Django : 게시물을 리디렉션하고 게시물 데이터를 전달하는 방법
Django views.py 파일에서 POST 요청을 처리 할 때 가끔 다른 URL로 리디렉션해야합니다. 리디렉션중인 URL은 동일한 Django views.py 파일의 다른 함수에 의해 처리됩니다. 이 작업을 수행하고 원래 POST 데이터를 유지하는 방법이 있습니까?
업데이트 : 내가 원하는 이유에 대한 더 많은 설명. 사용자가 텍스트 필드에 입력 한 데이터를 허용하는 두 개의 웹 앱 (AppA 및 AppB라고하겠습니다)이 있습니다. 사용자가 설치를 클릭하면 데이터가 처리되고 더 많은 결과가 표시됩니다. AppA와 AppB는 서로 다른 유형의 데이터를 기대합니다. 사용자가 실수로 AppB 유형 데이터를 AppA에 게시합니다. 이런 일이 발생하면 AppB로 리디렉션하고 AppB 결과를 표시하고 AppA에 입력 한 데이터로 채우고 싶습니다.
또한 :
클라이언트는 두 개의 개별적인 앱을 하나로 결합하기를 원합니다.
클라이언트 소유 코드를 표시 할 수 없습니다.
업데이트 2 : 나는 KISS가 여기서 최고의 원칙이라고 결정했습니다. 두 앱을 하나로 결합하여 더 간단하고 강력하게 만들었습니다. 나는 고객에게 최선의 방법이라고 확신 할 수 있습니다. 모든 훌륭한 의견에 감사드립니다. 설명 된대로 두 개의 앱을 유지하려는 경우 세션이 수행하는 방법이라고 생각합니다. 제안 해 주신 Matthew J Morrison에게 감사드립니다. Dzida의 제작은 디자인과 단순화에 대해 생각하게됩니다.
교체해야 할 가능성이 있습니다.
이것은 POST 데이터가 리디렉션과 함께 최고의 수없는 HTTP의 제한 사항입니다.
달성하려는 작업을 설명해 주시면 멋진 해결책에 대해 생각할 수있을 것입니다.
Matthew가 제안한대로 세션을 사용하지 않고 사용면 GET의 POST 변수를 새 페이지로 무제한 수 있습니다 (보안 및 쿼리에서 GET 매개 변수의 최대 길이와 같은 일부 제한 사항을 고려하십시오).
Update Update :) 2 개의 웹 앱이 있고 해당 앱이 하나의 views.py를 사용하는 것이 이상하게 들립니다 (맞는다고?). 어쨌든 GET의 POST에서 적절한보기로 데이터를 전달하는 것을 고려하십시오 (물론 데이터가 민감하지 않은 경우).
이 상황을 처리하는 방법은 세션에 게시물 데이터를 저장 한 다음 더 이상 필요하지 않을 때 제거하는 것입니다. 이렇게하면 해당 게시물이 사라진 경우에도 리디렉션 후 원본 게시물 데이터에 액세스 할 수 있습니다.
그것이 당신이하려는 일에 효과가 있습니까?
다음은 내가 제안하는 코드 샘플입니다. (테스트되지 않은 코드임을 명심하십시오)
def some_view(request):
#do some stuff
request.session['_old_post'] = request.POST
return HttpResponseRedirect('next_view')
def next_view(request):
old_post = request.session.get('_old_post')
#do some stuff using old_post
명심해야 할 또 다른 사항은 ...이 작업을 수행하고 파일을 업로드하는 경우에는 사용하지 않을 것입니다.
HTTP 1.1 임시 리디렉션 (307) 을 (를) 사용 합니다 .
불행히도 Django 와 (영구적) 301 또는 302 만 반환합니다. 직접 구현해야합니다.redirect()
HTTPResponseRedirect
from django.http import HttpResponse, iri_to_uri
class HttpResponseTemporaryRedirect(HttpResponse):
status_code = 307
def __init__(self, redirect_to):
HttpResponse.__init__(self)
self['Location'] = iri_to_uri(redirect_to)
django.http 모듈 도 참조하십시오 .
편집하다 :
최신 Django 버전에서 가져 오기를 다음으로 변경하십시오 .iri_to_uri
from django.utils.encoding import iri_to_uri
requests
패키지를 사용하십시오. 구현하기가 매우 뛰어납니다.
pip install requests
그런 다음 모든 방법으로 URL을 호출하고 데이터를 모든 수 있습니다.
가져 오기 요청에서보기
import requests
데이터를 게시 광고 형식을 따르십시오.
r = requests.post('http://yourdomain/path/', data = {'key':'value'})
장고보기에서 절대 URL을 얻으려면
request.build_absolute_uri(reverse('view_name'))
따라서 장고 뷰 코드는 다음과 가변적입니다.
r = requests.post(
request.build_absolute_uri(reverse('view_name')),
data = {'key':'value'}
)
및 속성 r
이있는 응답 객체는 어디에 있습니까? 상태 코드 (성공시 200이 됨)를 제공하고 응답 본문을 제공합니다. 응답을 json 형식으로 변환하고 json 메서드 ( )가 있습니다.status_code
content
r.status_code
r.content
r.json()
이미 요청을 사용하여 이전 뷰에서 새 뷰를 호출하기 만하면됩니다. 물론 리디렉션이 발생하지 않는 한보 기에서 다른보기로 데이터를 '전송'하는 것이 중요하지만 작동합니다.
다음 스 니펫을 테스트하고 작동합니다.
from django.views.generic import View
class MyOldView(View):
def post(self, request):
return MyNewView().post(request)
class MyNewView(View):
def post(self, request):
my_data = request.body
print "look Ma; my data made it over here:", my_data
렌더링 및 컨텍스트 를 함께 사용할 수 있습니다 .
Render(request,"your template path", {'vad name' : var value}
템플릿에서 변수를받을 수 있습니다.
{% If var name %}
{{ var name }}
{% endif %}
최근에 직면 한 문제.
기본적으로 나는 양식 A를 가지고 있었고, 그것을 제출하면 다른 양식 B가 나타나고 몇 가지 결과 + 양식이 포함됩니다. B를 제출할 때 사용자에게 경고를 표시하고 사용자를 B에만 유지하고 싶었습니다.
이 문제를 해결 한 방법 <output>
은 B 의 필드에 결과를 표시하는 것 입니다.
<output name="xyz" value="xyz">{{xyz}}</output>
그리고 A-> B와 B-> B에 대해 동일한 뷰를 사용했습니다. 이제 요청이 A 또는 B에서 오는지 구별하고 그에 따라 렌더링해야합니다.
def view1(request):
if "xyz" in request.POST:
# request from B
# do some processing
return render(request, 'page.html', {"xyz":request.POST["xyz"]})
else:
# request from A
res = foo() # some random function
return render(request, 'page.html', {"xyz":res})
그러나 이것은 B 형이 작고 동적이 아닌 경우에만 작동합니다.
에 대한 POST를 처리 한 후 리디렉션을 사용하는 경우 AppB
실제로 AppB
메서드에서 메서드를 호출하지 않아도됩니다 AppA
.
예 :
def is_appa_request(request):
## do some magic.
return False or True
is_appb_request = is_appa_request
def AppA(request):
if is_appb_request(request):
return AppB(request)
## Process AppA.
return HttpResponseRedirect('/appa/thank_you/')
def AppB(request):
if is_appa_request(request):
return AppA(request)
## Process AppB.
return HttpResponseRedirect('/appb/thank_you/')
이는 최종 사용자에게 투명한 경험을 제공해야하며 귀하를 고용 한 고객은 그 차이를 결코 알지 못할 것입니다.
POST 후 리디렉션되지 않는 경우 사용자가 페이지를 새로 고쳐 중복 데이터가 걱정되지 않습니까?
'ProgramingTip' 카테고리의 다른 글
Angular2는 요소의 내부 속성이 아니므로 바인딩 할 수 없습니다. (0) | 2020.11.01 |
---|---|
Python : ".. % (var) s .."% locals ()를 사용하는 것이 좋은 방법입니까? (0) | 2020.11.01 |
AJAX 및 jQuery로 django 양식을 게시하는 방법 (0) | 2020.11.01 |
std :: unique_ptr을 전달하는 방법은 무엇입니까? (0) | 2020.11.01 |
입력 파일이 아닌 리터럴 언어로 sed (0) | 2020.11.01 |