代码之家  ›  专栏  ›  技术社区  ›  Mustaghees

烧瓶会话值未在共享主机上持久化

  •  1
  • Mustaghees  · 技术社区  · 7 年前

    我在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上的其他类似问题也无法解决。欢迎任何解决方案/帮助。谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Mustaghees    7 年前

    我还是不确定 session 是否正在编写中(正如Danila Ganchar所指出的),但只对第三条配置行进行了注释,就解决了问题。

    因此 test.py 是:

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

    我猜 mkdtemp() 没有在localhost上正常工作。