【问题标题】:Django - Python :: How to pass a variable to another page on Render/RedirectDjango - Python :: 如何在渲染/重定向上将变量传递到另一个页面
【发布时间】:2018-08-06 04:30:51
【问题描述】:

我有一个登录页面 A,我在其中获取用户/密码信息,然后发布到另一个 3rd 方网站并获取 JSON 格式的 sessionid 变量。当我重定向/呈现摄取页面 B 时,我需要此 sessionid 变量在此处显示/可用。

这是我尝试过的,但我似乎无法让它工作。有人可以帮忙吗?

urls.py

from django.urls import path
from loginp.views import LoginView
from loginp.views import IngestionView

urlpatterns = [
    path('login/', LoginView.as_view(),name='LoginView'),
    path('ingestion/', IngestionView.as_view(template_name='registration/ingestion.html'),name='IngestionView'),]

views.py

from django.views.generic import TemplateView
from django import forms
from django.shortcuts import render, redirect
from django.http import HttpResponse, HttpResponseRedirect
from .forms import LoginForm
from .forms import IngestionForm
import json
import requests

class LoginView(TemplateView):
template_name = 'registration/login.html'

def get(self, request):
    form = LoginForm()
    return render(request, self.template_name, {'form':form})

def post(self, request):
    form = LoginForm(request.POST)
    if form.is_valid():
        #print form.cleaned_data()
        text = form.cleaned_data['email']
        pwd = form.cleaned_data['password']

    data = {
     "@type": "login",
     "username": text,
     "password": pwd
    }


    data_json = json.dumps(data)
    headers = {'Content-type': 'application/json'}
    url='https://cloud.com/ma/api/v2/user/login'
    response = requests.post(url, data=data_json, headers=headers)
    sessionid=response.json()['icSessionId']

    form1 = IngestionForm()
    #return render(request,'registration/ingestion.html',{'sessionid':sessionid}) #{'info':args})
    #return HttpResponseRedirect(reverse('IngestionView', kwargs={'sessionid':sessionid}))
    return redirect(request,'registration/ingestion.html',sessionid=sessionid) 


class IngestionView(TemplateView):
template_name = 'registration/ingestion.html'


def post(self, request):
    form1 = IngestionForm(request.POST)

    args1 = {"form": form1}
    return render(request, self.template_name, args1)

登录.html

<html>
<head>
<title>Login Page</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
</head>
<div class="container">
        <div class="login-form col-md-4 offset-md-4">
            <h4 class="title">Please Login</h4>
            <br>
            <form action="{% url 'IngestionView' %}" method="POST">
            <div class="form-group" >
              {% csrf_token %}  
              {{form.as_p}}     
              <br>
              <button class="btn btn-primary btn-block" type="submit" value='submit'>login</button>
             </div>
            </form>
        </div>
</div>
</body>
</html>

摄取.html

<html>
<head>
<title>Ingestion Details</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
</head>
<div class="container">
            <h4 class="title">Ingestion Details</h4>
            <br>
            <form method="POST">    
            <div class="form-group" >
              {% csrf_token %}  
              {{ form.as_p }}       
              <br>
              <button class="btn btn-primary btn-block" type="submit" value='submit'>Do something</button>

             </div>
            </form>
        </div>
</div>
<h2>Session Id {{ sessionid }}</h2>
</body>
</html>

视图.py

data_json = json.dumps(data)
headers = {'Content-type': 'application/json'}
url='https://dm-us.informaticacloud.com/ma/api/v2/user/login'
response = requests.post(url, data=data_json, headers=headers)
sessionid=response.json()['icSessionId']
request.session['sessionid'] = sessionid
request.session.save()
form1 = IngestionForm()
return render(request,'registration/ingestion.html',{'sessionid':sessionid}) #{'info':args})

摄取.html

<h2>Session Id {{ request.session.get('sessionid') }}</h2>

【问题讨论】:

    标签: python django variables redirect response


    【解决方案1】:

    您可以将此值保存到 Django 的session。第一眼:

    sessionid=response.json()['icSessionId']
    request.session['sessionid'] = sessionid
    

    在第二个视图中:

    class IngestionView(TemplateView):
        template_name = 'registration/ingestion.html'
    
    
        def post(self, request):
            form1 = IngestionForm(request.POST)
            sessionid=request.session['sessionid']
            args1 = {"form": form1, 'sessionid': sessionid}
            return render(request, self.template_name, args1)
    

    【讨论】:

    • 谢谢@neverwalkaloner。现在会试试这个。我有个疑问。如果 2 个不同的用户登录,维护会话变量会导致问题吗?如何分别跟踪 2 个用户?
    • @sammydude Django 会为你做这件事。每个用户都有不同的会话数据。
    • 谢谢@neverwalkaloner!对不起,菜鸟问题:) 所以我试图在视图中包含上面的代码。查看 1 - 在重定向之前我分配了会话变量。我如何访问它?我试图直接在第二页 HTML 中访问该变量,但没有得到值。
    • @sammydude 你能在问题中添加代码吗?它在评论中不可读。
    • 对不起。在主要部分的底部实现并添加了新代码。我们也可以在第二个视图的 POST 部分中以相同的方式访问会话变量吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多