Flask 会话值不会持续存在于共享主机上
Flask session value not persisting on shared hosting
我在本地主机上开发了一个 Flask 应用程序 (运行 Python 3)。它有效,但当转移到我的共享主机帐户 (运行 Python 2) 时,它不起作用。我修复了与 Python 版本相关的所有问题。但是 session
不起作用。它的值不会在请求之间持续存在。
我尝试用更简单的代码重现问题 (test.py
),注释掉的部分是我的应用程序中会话的配置方式:
import sys
sys.path.insert(0, '/home/user_name/public_html')
from flask import Flask, request, session
from flask.ext.session import Session
from tempfile import mkdtemp
from cs50 import SQL
from constants import *
app = Flask(__name__)
#app.config["SESSION_TYPE"] = "filesystem"
#app.config["SESSION_PERMANENT"] = False
#app.config["SESSION_FILE_DIR"] = mkdtemp()
Session(app)
@app.route('/set/')
def set():
session['key'] = 'value'
return 'ok'
@app.route('/get/')
def get():
return "{}".format(session.get('key'))
如果你去/set/
,你会看到ok
。但是在 /get/
你会看到 None
.
这是我的 CGI 文件(我只需要共享主机,不需要本地主机):
#!/home/user_name/public_html/cgi-bin/flask/bin/python
import sys
sys.path.insert(0, '/home/user_name/public_html')
# Enable CGI error reporting
import cgitb
cgitb.enable()
import os
from wsgiref.handlers import CGIHandler
app = None
try:
import test
app = test.app
except Exception, e:
print "Content-type: text/html"
print
cgitb.handler()
exit()
#os.environ['SERVER_PORT'] = '80'
#os.environ['REQUEST_METHOD'] = 'POST'
class ScriptNameStripper(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['SCRIPT_NAME'] = ''
return self.app(environ, start_response)
app = ScriptNameStripper(app)
try:
CGIHandler().run(app)
except Exception, e:
print "Content-type: text/html"
print
cgitb.handler()
exit()
如果需要 .htaccess
文件:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /cgi-bin/mas.cgi/ [L]
谷歌搜索没有帮助,Whosebug 上的其他类似问题也没有解决。欢迎任何 solution/help。谢谢!
我仍然不确定 session
是否被写入(正如@Danila Ganchar 指出的那样),但仅注释掉第三个配置行就解决了这个问题。
因此 test.py
中所做的更改是:
app.config["SESSION_TYPE"] = "filesystem"
app.config["SESSION_PERMANENT"] = False
#app.config["SESSION_FILE_DIR"] = mkdtemp()
我想 mkdtemp()
没有像在本地主机上那样工作。
我在本地主机上开发了一个 Flask 应用程序 (运行 Python 3)。它有效,但当转移到我的共享主机帐户 (运行 Python 2) 时,它不起作用。我修复了与 Python 版本相关的所有问题。但是 session
不起作用。它的值不会在请求之间持续存在。
我尝试用更简单的代码重现问题 (test.py
),注释掉的部分是我的应用程序中会话的配置方式:
import sys
sys.path.insert(0, '/home/user_name/public_html')
from flask import Flask, request, session
from flask.ext.session import Session
from tempfile import mkdtemp
from cs50 import SQL
from constants import *
app = Flask(__name__)
#app.config["SESSION_TYPE"] = "filesystem"
#app.config["SESSION_PERMANENT"] = False
#app.config["SESSION_FILE_DIR"] = mkdtemp()
Session(app)
@app.route('/set/')
def set():
session['key'] = 'value'
return 'ok'
@app.route('/get/')
def get():
return "{}".format(session.get('key'))
如果你去/set/
,你会看到ok
。但是在 /get/
你会看到 None
.
这是我的 CGI 文件(我只需要共享主机,不需要本地主机):
#!/home/user_name/public_html/cgi-bin/flask/bin/python
import sys
sys.path.insert(0, '/home/user_name/public_html')
# Enable CGI error reporting
import cgitb
cgitb.enable()
import os
from wsgiref.handlers import CGIHandler
app = None
try:
import test
app = test.app
except Exception, e:
print "Content-type: text/html"
print
cgitb.handler()
exit()
#os.environ['SERVER_PORT'] = '80'
#os.environ['REQUEST_METHOD'] = 'POST'
class ScriptNameStripper(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['SCRIPT_NAME'] = ''
return self.app(environ, start_response)
app = ScriptNameStripper(app)
try:
CGIHandler().run(app)
except Exception, e:
print "Content-type: text/html"
print
cgitb.handler()
exit()
如果需要 .htaccess
文件:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /cgi-bin/mas.cgi/ [L]
谷歌搜索没有帮助,Whosebug 上的其他类似问题也没有解决。欢迎任何 solution/help。谢谢!
我仍然不确定 session
是否被写入(正如@Danila Ganchar 指出的那样),但仅注释掉第三个配置行就解决了这个问题。
因此 test.py
中所做的更改是:
app.config["SESSION_TYPE"] = "filesystem"
app.config["SESSION_PERMANENT"] = False
#app.config["SESSION_FILE_DIR"] = mkdtemp()
我想 mkdtemp()
没有像在本地主机上那样工作。