- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个带有 session 的 Flask 应用程序,它在我的本地开发机器上运行良好。但是,当我尝试将它部署到 Amazon 服务器上时, session 似乎不起作用。
更具体地说,未设置 session cookie。但是,我可以设置普通 cookie。我确保我有一个静态安全 key ,因为其他人已经指出这可能是一个问题。唯一的区别在于服务器的设置方式。在开发过程中,我使用
app.run()
在本地运行。部署时,我使用
app.config['SERVER_NAME'] = '12.34.56.78' # <-- insert a "real" IP
app.run(host='0.0.0.0', port=80)
我怀疑问题可能出在上面,但不完全确定。
session 确实似乎可以在 Firefox 上运行,但不能在 Chrome 上运行。
下面的小应用程序演示了这个问题,底部的配置差异:
from flask import Flask, make_response, request, session
app = Flask(__name__)
app.secret_key = 'secretKey'
# this is to verify that cookies can be set
@app.route('/setcookie')
def set_cookie():
response = make_response('Cookie set')
response.set_cookie('cookie name', 'cookie value')
return response
@app.route('/getcookie')
def get_cookie():
if 'cookie name' in request.cookies:
return 'Cookie found. Its value is %s.' % request.cookies['cookie name']
else:
return 'Cookie not found'
# this is to check if sessions work
@app.route('/setsession')
def set_session():
session['session name'] = 'session value'
return 'Session set'
@app.route('/getsession')
def get_session():
if 'session name' in session:
return 'Session value is %s.' % session['session name']
else:
return 'Session value not found'
if __name__ == '__main__':
app.debug = True
# windows, local development
#app.run()
# Ubuntu
app.config['SERVER_NAME'] = '12.34.56.78' # <-- insert a "real" IP
app.run(host='0.0.0.0', port=80)
最佳答案
这是 Chrome 中的“错误”,而不是您的应用程序的问题。 (如果其他浏览器更改其政策,它也可能会影响其他浏览器。)
RFC 2109描述了 cookie 的处理方式,似乎表明 cookie 域必须是带有 TLD(.com、.net 等)的 FQDN 或者是完全匹配的 IP 地址。 original Netscape cookie spec根本没有提到 IP 地址。
Chrome 开发人员决定比其他浏览器更严格地接受 cookie 域的值。在某一时刻 they corrected a bug阻止了 IP 地址上的 cookie,they have apparently backpedaled从那时起,不允许在非 FQDN 域(包括本地主机)或 IP 地址上使用 cookie。他们已声明他们不会修复此问题,因为他们认为这不是错误。
“正常”cookie 有效但 session cookie 无效的原因是您没有为“正常”cookie 设置域(这是一个可选参数),但 Flask 自动将 session cookie 的域设置为服务器名称
。 Chrome(和其他浏览器)接受没有域的 cookie 并将它们自动设置为响应的域,因此观察到行为差异。如果您将域设置为 IP 地址,您可以观察到正常的 cookie 失败。
在开发过程中,您可以通过在本地主机上运行应用程序而不是让它默认为 127.0.0.1 来解决这个问题。 Flask has a workaround如果服务器名称是 localhost,则不会发送 session cookie 的域。 app.run('localhost')
在生产中,没有任何真正的解决方案。您可以在域而不是 IP 上提供此服务,这可以解决问题,但在您的环境中可能无法实现。您可以强制要求所有客户使用 Chrome 以外的东西,这是不切实际的。或者,您可以为 Flask 提供一个不同的 session 接口(interface),该接口(interface)对它已经用于本地主机的 IP 执行相同的解决方法,尽管这在某种程度上可能是不安全的。
Chrome 不允许带有域 IP 的 cookie,并且没有实际的解决方法。
关于python - 为什么 session cookie 在从域提供服务时有效,但在使用 IP 时无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27254013/
我遇到了一个奇怪的问题。我有这个: $(document).ready(function () {
我正在编写一个程序,它从列表中读取一些 ID,从中找出不同的 URL,然后将图像保存到我的 C: 驱动器中。 如果我在浏览器中导航到图像 URL,它们就会起作用。此外,如果我尝试从不同的服务器获取图像
我编写了一个 REST WCF RIA Silverlight 4.0 兼容服务,我可以从 javascript + jQuery.1.4.2.js + JSON2.js(当然,还可以从 .NET 4
我很确定这个网站实际上还没有得到回答。一劳永逸地,与 32 位有符号整数范围内的数字字符串匹配的最小正则表达式是什么,范围是 -2147483648至 2147483647 . 我必须使用正则表达式进
我有两个data.table;我想从那些与键匹配的元素中随机分配一个元素。我现在这样做的方式相当慢。 让我们具体点;这是一些示例数据: dt1<-data.table(id=sample(letter
我已经安装了 celery 、RabitMQ 和花。我可以浏览到花港。我有以下简单的工作人员,我可以将其附加到 celery 并从 python 程序调用: # -*- coding: utf-8 -
我正在使用 ScalaCheck 在 ScalaTest 中进行一些基于属性的测试。假设我想测试一个函数,f(x: Double): Double仅针对 x >= 0.0 定义的, 并返回 NaN对于
我想检查文件是否具有有效的 IMAGE_DOS_SIGNATURE (MZ) function isMZ(FileName : String) : boolean; var Signature: W
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我在工作中查看了一些代码,发现了一些我以前没有遇到过的东西: for (; ;) { // Some code here break; } 我们一直调用包含这个的函数,我最近才进去看看它是
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我试图编写一个函数,获取 2D 点矩阵和概率 p 并以概率 p 更改或交换每个点坐标 所以我问了一个question我试图使用二进制序列作为特定矩阵 swap_matrix=[[0,1],[1,0]]
这个问题在这里已经有了答案: Using / or \\ for folder paths in C# (5 个答案) 关闭 7 年前。 我在某个Class1中有这个功能: public v
PostgreSQL 10.4 我有一张 table : Column | Type ------------------------- id | integer| title
我正在 Postgresql 中编写一个函数,它将返回一些针对特定时区(输入)计算的指标。 示例结果: 主要问题是这只是一个指标。我需要从其他表中获取其他 9 个指标。 对于实现此目标的更简洁的方法有
我需要在 python 中模拟超几何分布(用于不替换采样元素的花哨词)。 设置:有一个装满人口许多弹珠的袋子。弹珠有两种类型,红色和绿色(在以下实现中,弹珠表示为 True 和 False)。从袋子中
我正在使用 MaterializeCSS 框架并动态填充文本输入。我遇到的一个问题是,在我关注该字段之前,valid 和 invalid css 类不会添加到我的字段中。 即使我调用 M.update
是否有重叠 2 个 div 的有效方法。 我有以下内容,但无法让它们重叠。 #top-border{width:100%; height:60px; background:url(image.jpg)
我希望你们中的一位能向我解释为什么编译器要求我在编译单元中重新定义一个静态固定长度数组,尽管我已经在头文件中这样做了。这是一个例子: 我的类.h: #ifndef MYCLASS_H #define
我正在使用旧线程发布试图解决相同问题的新代码。什么是安全 pickle ? this? socks .py from socket import socket from socket import A
我是一名优秀的程序员,十分优秀!