포스트 데이터로 리디렉션하는 방법(장고)
Django views.py 파일에서 POST 요청을 처리할 때 때때로 다른 URL로 리디렉션해야 합니다.제가 리디렉션하는 이 URL은 동일한 Django views.py 파일의 다른 함수에서 처리됩니다.이 작업을 수행하고 원래 POST 데이터를 유지할 수 있는 방법이 있습니까?
업데이트: 이 작업을 수행해야 하는 이유에 대한 자세한 설명나는 사용자가 텍스트 필드에 입력한 데이터를 받아들이는 두 개의 웹 앱(A 앱과 B 앱이라고 부릅시다)을 가지고 있습니다.사용자가 제출을 클릭하면 데이터가 처리되고 세부 결과가 표시됩니다.A 앱과 B 앱은 서로 다른 유형의 데이터를 기대합니다.때때로 사용자가 실수로 A 앱에 B 앱 유형 데이터를 게시합니다.이 경우, 저는 그들을 B 앱으로 리디렉션하여 B 앱 결과를 보여주거나 적어도 그들이 A 앱에 입력한 데이터로 채우고 싶습니다.
또한:
고객은 하나로 결합하는 것이 아니라 두 개의 별도 앱을 원합니다.
코드는 고객의 것이기 때문에 보여줄 수 없습니다.
업데이트 2: 저는 KISS가 여기서 최고의 원칙이라고 결정했습니다.두 개의 앱을 하나로 통합하여 보다 단순하고 강력한 솔루션을 구축했습니다. 고객에게도 이 방법이 최선이라고 확신시킬 수 있을 것입니다.좋은 피드백을 주셔서 감사합니다.설명된 것처럼 두 개의 앱을 유지한다면 세션이 이를 위한 방법이 될 것이라고 생각합니다. Matthew J Morrison이 제안해 주셔서 감사합니다.Dzida 덕분에 디자인과 단순화에 대해 생각하게 되었습니다.
이러한 문제에 직면한 경우 설계를 수정해야 할 가능성이 약간 있습니다.
이는 POST 데이터가 리디렉션과 함께 사용할 수 없는 HTTP 제한 사항입니다.
당신이 무엇을 성취하려고 하는지 설명해 주시겠습니까? 그러면 우리는 어떤 깔끔한 해결책에 대해 생각해 볼 수 있을 것입니다.
매튜가 제안한 대로 세션을 사용하지 않으려면 GET의 POST 매개 변수를 새 페이지로 전달할 수 있습니다(예: 보안 및 쿼리 문자열의 GET 매개 변수 최대 길이).
업데이트를 업데이트합니다.당신이 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)을 사용해야 합니다.
안타깝게도 장고와 (영구)는 301 또는 302만 반환합니다.직접 구현해야 합니다.
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 버전에서 가져오기를 다음으로 변경합니다.
from django.utils.encoding import iri_to_uri
사용하다requests
구현하기 매우 .
pip install requests
그런 다음 어떤 방법으로든 URL을 호출하고 데이터를 전송할 수 있습니다.
보기에서 가져오기 요청
import requests
데이터를 게시하려면 형식을 따릅니다.
r = requests.post('http://yourdomain/path/', data = {'key':'value'})
django 뷰에서 절대 URL을 가져오려면 사용
request.build_absolute_uri(reverse('view_name'))
따라서 장고 보기 코드는 다음과 같습니다.
r = requests.post(
request.build_absolute_uri(reverse('view_name')),
data = {'key':'value'}
)
r
의 응답 개체입니다.status_code
그리고.content
기여하다. r.status_code
됨)와 상태 코드를 합니다.r.content
응답 본문을 제공합니다.json 방법이 있습니다(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로만 유지하고 싶었습니다.
를 제가해방결다같표것입는다니하시이과음과를법결한은▁a▁ining로 표시하는 것입니다.<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 후 리다이렉트를 하지 않으면 사용자가 페이지를 새로 고치기 때문에 중복 데이터가 걱정되지 않습니까?
요청을 사용하여 세션으로 리디렉션할 수 있습니다.session["키"]는 아래와 같습니다.
# "views.py"
from django.shortcuts import redirect
def my_view(request):
# Here
request.session["message"] = "success"
return redirect("https://example.com")
# "index.html"
{{ request.session.message }} {# success #}
언급URL : https://stackoverflow.com/questions/3024168/how-to-redirect-with-post-data-django
'programing' 카테고리의 다른 글
jQuery에서 지정된 클래스 없이 모든 요소를 선택하려면 어떻게 해야 합니까? (0) | 2023.07.26 |
---|---|
Excel이 내 CSV의 URL을 하이퍼링크로 해석할 수 있습니까? (0) | 2023.05.07 |
Xcode UI 테스트의 경우 지연/대기 (0) | 2023.05.07 |
VB.NET: 데이터 그리드 보기 지우기 (0) | 2023.05.07 |
단일 SELECT 문에 공통 테이블 식을 여러 개 사용하려면 어떻게 해야 합니까? (0) | 2023.05.07 |