我希望在我的网页的to中有一个输入元素,其中包含登录用户的一些全局设置。我如何将这段数据附加到我的Web应用程序中的每个GET / POST和AJAX请求中?我想把它解决到已经拥有大量代码的现有网站上。
Cookie不是我想要的,因为在同一个应用程序的不同选项卡/窗口中,同一个站点不能有两个不同的cookie(HTML输入可能对同一登录用户具有不同的值在两个不同的选项卡/窗口中。)
更新:为了澄清,我想要的功能是在同一个浏览器中桥接两种不同的模式,让用户通过选项菜单在两种模式之间切换。当前模式会影响用户所做的一切甚至是短/小Ajax请求(每个进入系统的请求都需要知道浏览器窗口所处的模式。)因此,同一浏览器中的两个不同选项卡的行为与每个其他如果他们处于不同的模式。
答案 0 :(得分:11)
如果我理解正确,您的应用有两种模式。我们打电话吧 他们红色和蓝色。用户打开窗口1并选择红色。用户 然后打开窗口2并选择蓝色。如果你只是用过 会话,然后如果用户返回窗口1并单击 什么,结果将是蓝色,因为前一次点击 虽然窗口1是红色的,但它是蓝色的。
我建议使用mod_rewrite(或非Apache上的等价物) 服务器)修改URL以指示模式。
的传入请求
example.com/red/yourscript ==> example.com/yourscript?mode=red
example.com/blue/yourscript ==> example.com/yourscript?mode=blue
如果您网页上的所有链接和表单都是相对的而不是 绝对,URL应该包含模式信息。
也就是说,如果页面网址是
example.com/red/yourscript
然后页面上的链接看起来像这样
<form action="anotherscript">
的网址为
example.com/red/anotherscript
另一种方法是使用子域
red.example.com/yourscript ==> example.com/yourscript
blue.example.com/yourscript ==> example.com/yourscript
如果您将服务器配置为从同一个真实位置同时提供两个子域,则不需要mod_rewrite。
使用子域可以从中提取模式 每个传入请求的http_referer字段和你 不需要添加查询字符串。
最后,添加绝对链接以明确更改模式。
<a href="http://example.com/red/changemode">Click here to go to RED mode</a>
<a href="http://example.com/blue/changemode">Click here to go to BLUE mode</a>
答案 1 :(得分:5)
听起来像隐藏字段的经典案例。显然,当你发送HTML时,你需要某种方式来了解用户是谁。注意,这根本不是安全的,用户可能会发送他们想要的任何数据。
<input type="hidden" name="fieldname" value="fieldvalue" />
答案 2 :(得分:3)
如何为2种不同的模型制作不同的子域?
答案 3 :(得分:2)
为什么不使用sessions来保存用户数据?通过会话,您可以跨帖子保留数据,根据页面保留会话数据。
答案 4 :(得分:1)
答案 5 :(得分:1)
你试图听起来有点像stackoverflow question我的回答。
您可以在中间件中进行这样的更改(请参阅上面的链接)但它确实没有意义。您更有可能想要更改会话数据。
以下是我看到的不同选项。
1)GET
更改GET数据将有效地重定向用户,因为它更改了URL中的地址,并将用户发送到新页面。因此,您可以编辑它,但每次加载页面时它都会重定向用户!馊主意。否则,您可以以某种方式管理您的URL,以便每个链接添加一些内容,但它仍然没有意义,因为未登录的用户可以将其添加到URL,如果他们知道它是什么。再次,糟糕的主意。
2)POST
帖子信息是从浏览器发送给您的信息,除了清理数据外,它还不是添加和替换信息的正确位置。
3)会话
您可以了解Django会话here。这是一种在许多地方使用的技术,特别是在django.contrib.auth中。会话用于验证用户并修改请求object。这可能是您想要做的,在这里您可以修改会话或更改请求对象 - 但是,我要警惕对请求进行太多更改,因为它可能导致与其他应用程序冲突或未来的django更改/添加
4)jQuery(因为你将其标记为jQuery)
如果你坚持的话,你可以在javascript中做一些hacky和讨厌的事情。
$("a").each(function()
{
this.href += "?newdata=1";
});
但是我不建议这样做,并没有考虑到已有GET数据(如果有)。我只是添加它以向您展示另一个选项,因为我不太确定您要做什么。
答案 6 :(得分:0)
为什么不使用自定义模板渲染方法?
def myrender(request, model, data={}):
from django.template import RequestContext
from django.shortcuts import render_to_response
data['user'] = request.user
return render_to_response(model, data, context_instance=RequestContext(request))
然后创建templatetag以在您的网页中呈现此内容?
我使用此技术显示登录信息和当前页面
答案 7 :(得分:0)
这可能完全没用,具体取决于您的“模式”:
如果服务器每次都返回相同的页面,并且通过javascript应用模式,该怎么办? JS可以改变样式和DOM,或者发出不同的AJAX请求,具体取决于模式。
答案 8 :(得分:0)
这可以通过jquery.Metadata优雅地完成。您只需要在每个页面上推送一个表单,其中包含一个元素,其中包含您在每个表单提交后附加到的所有数据:
在每页上你都会:
<form name="_settings" type="post">
<p>
<input name="_settings" type="hidden" value="{preference: 'chocolate',
displayListSize: 30, something: 'else'}" />
</p>
</form>
现在你可以用类似的方式做点什么:
// Bind to the submit event of each form
$('form').submit(function () {
// Append all input fields from `_settings`
$(this).append('form[name="settings"]:input');
return true;
});
或者将设置附加到特定表单或所有表单(如果未指定):
function appendSettings(form) {
if (form)
$(form).append('form[name="_settings"]:input');
else
$('form').append('form[name="_settings"]:input');
}
...之后您可以将表单作为AJAX请求的一部分提交(否则可能没有触发表单submit
事件)
编辑:
关于通过链接的GET / POST请求:
$('a').click(function(event) {
href = $(this).attr('href');
event.stopPropagation();
event.preventDefault();
if (!href.match('?'))
// Change the form's action to the link's reference
$('form[name="_settings"']).attr('action', href).submit();
else {
/* Sanitize the form's data into GET paramaters and
change the window's location*/
}
});
如果您不想使用jquery.Metadata,您可以在_settings
表单上创建具有名称/值对的隐藏字段,并且它仍然有效。我已经将它用作便携式数据的一个很好的例子,因为JS和Django都可以说JSON。
另外,我通过编写一个jQuery示例来假设太多,但我有点希望你已经使用了一些框架,这可以巧妙地转换到你选择的框架。
答案 9 :(得分:0)
您可以创建custom context processor并将其与RequestContext一起使用,为您的通用模板添加一些自定义数据(然后使用inheritance将其转换为所有其他模板,如Hank Gay说)。
答案 10 :(得分:0)
我有一个应用程序,它现在以这种方式存储整个会话,我已经为我的所有服务器调用引入了专门的ajax包装器。
$.myget = function (url, data, k) {
$.get(url, $.extend(read_session_data(), data), k);
}
read_session_data
留给读者练习。
除了管理这个问题外,它还使我更容易以受控(简洁)的方式处理错误。