【问题标题】:Django new session for each browser tab每个浏览器选项卡的 Django 新会话
【发布时间】:2019-11-23 09:29:32
【问题描述】:

我对 Django 会话有疑问,我不知道如何解决。基本上我将一些数据存储在一个视图函数中的session 字典中,并使用第一个视图中的值在第二个函数中计算一些东西。现在,如果有人打开两个选项卡,在一个选项卡中填写数据并提交,填写第二个选项卡并提交,则两个选项卡的会话字典将相同。我希望我用正确的方式表达自己。

简单解释:

def a(request):
    request.session["q"] = request.POST.get('q')

def b(request):
    while True:
        print(request.session["q"])

所以不要假设函数a 正在渲染一个索引页面,并从那里获取一个值。在此index 页面功能中按下按钮b 被调用。现在,如果我打开两个选项卡,在索引页面中输入1 并提交,我会在终端中看到很多 1。现在我打开另一个标签,输入2,提交,打印会改变。

我想做的是在浏览器的不同选项卡上保持从我的服务器到用户的单独会话(进出的单独信息)。

如果我的措辞有误,我很抱歉,这是我第一次尝试使用 Web 服务器。

编辑:

正如我在 cmets 中提到的,答案目前不起作用,我认为这只是一个语法错误,但我不知道我哪里出错了。

我的模板:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
{% load staticfiles %}
<HTML>
<HEAD>
    <LINK rel="stylesheet" type="text/css" href="{% static 'style7.css' %}"/>
    <link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}"/>
    <script src="http://cdn.bokeh.org/bokeh/release/bokeh-0.12.13.min.js"></script>
    <link rel="stylesheet" href="http://cdn.bokeh.org/bokeh/release/bokeh-0.12.13.min.css">
<script type="application/javascript">function makeid() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < 5; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    return text;
}
 document.getElementById("session").value = makeid();</script>
</HEAD>

<BODY>
....
....
<form action="{% url 'raw' %}" method="post" style="float: left;">{% csrf_token %}<input type="hidden" name="session" id="session"><input type="submit" value="Download text"/></form>
....

我的视图功能:

def plot(request):
    print(request.POST.get("session"))
    ....

但是在终端看不到任何打印,因此我认为该变量是一个空字符串。

【问题讨论】:

  • @mohammedqudah 嗨,谢谢我之前找到了这个线程,并且也试图调查这个,但是我不明白它对我有什么帮助。据我了解,这是一个 JS 命令(我可能在这里大错特错),我不知道我应该在哪个模板中使用它,我应该在 Django 等中做些什么
  • @mohammedqudah 我也试过request.sessionStorage["asd"] = 2,但它给出了错误,因为 sessionStorage 不存在。
  • 这实际上可以使用 ajax 和 js 以及 django 视图来完成,但它会使您的代码变得复杂,您不必这样做。但我可以告诉你明天怎么做,因为我现在要睡觉了:D,再见:)
  • @mohammedqudah 非常感谢,我真的坚持这一点。

标签: python django session


【解决方案1】:

我不知道您正在制作什么应用程序,但可以说我想将用户名保存为会话。

1.我们需要创建一个脚本来创建随机代码并将其分配给隐藏输入

function makeid() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < 5; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    return text;
}

 window.onload = function() {
 document.getElementById("session").value = makeid();
 }

2。在您从用户那里获取数据的形式中添加一个新的隐藏输入

<form>
   ...
   <input type="hidden" name="session" id="session">
</form>

3.现在,当用户将表单提交到视图时,我们需要在视图中执行此操作

def someview(request):
    session_id = request.GET.get('session')
    username = request.GET.get('username') # or any data...
    request.session['username_%s' % session_id] = username
    # now lets say you want to redirect the user to the next page... 
    # you have to send the 'session_id' to it and always send to
    # the next view then in that view retrieve his name like this
    # ``name = request.session['username_%s' % session_id] ``
    # the session_id from the old view

所以网址应该是这样的:

/first-step/?session=somecode.

/second-step/?session=somecode

如果您有更多字段,您必须在会话中保存它们并像我一样检索它们,希望它对您有所帮助,我知道它很复杂! 再见:)

【讨论】:

  • 我了解该方法,并且我认为它也适用于我的情况,但是我认为我的语法有一些问题。我添加了 javascript sn-p,隐藏输入,但是我无法在视图中打印出生成的随机字符串。我会用我的代码更新我的答案,我很确定这只是一个愚蠢的语法错误,但我对 JS 一无所知。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2023-04-11
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多