【问题标题】:Flask session value not persisting on shared hostingFlask 会话值不会保留在共享主机上
【发布时间】:2018-01-20 10:47:28
【问题描述】:

我在 localhost 上开发了一个 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/$1 [L]

谷歌搜索没有帮助,Stackoverflow 上的其他类似问题也无法解决。欢迎任何解决方案/帮助。谢谢!

【问题讨论】:

  • 有人吗?没人吗?
  • 您确定会话已写入文件吗?尝试将return 'ok' 更改为return json.dumps(session)
  • @DanilaGanchar 它引发了这个错误:<FileSystemSession {'key': 'value'}> is not JSON serializable
  • dumps 更改为 print 或将会话值写入日志文件。只需确保已编写会话

标签: python flask cgi shared-hosting cs50


【解决方案1】:

我仍然不确定session 是否正在编写(正如@Danila Ganchar 指出的那样),但只有注释掉第三个配置行才能解决问题。

所以test.py 中所做的更改是:

app.config["SESSION_TYPE"] = "filesystem"
app.config["SESSION_PERMANENT"] = False
#app.config["SESSION_FILE_DIR"] = mkdtemp()

我猜mkdtemp() 没有像在本地主机上那样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 2017-07-07
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多