【问题标题】:display a list of last pages visited using flask app显示使用烧瓶应用程序访问的最后一页列表
【发布时间】:2012-11-15 20:23:21
【问题描述】:

我发现了这个问题(How to display a list of "latest pages visited"),关于如何显示最近访问过的 ruby​​ on rails 页面列表。你会如何用烧瓶做到这一点?你使用网址映射吗?代码看起来像这样,我也在使用 Heroku。

app = Flask(__name__)

app.secret_key = 'supersecretkey'

def login():
    session['username'] = "someuser"
    session['urls'] = []

@app.after_request
def store_visted_urls():
    session['urls'].append(request.url)
    if(len[session['urls']) > 5:
        session['urls'].pop(0)
    session.modified = True

@app.route('/')
def index():
    data = []
    if 'urls' in session:
        data = session['urls']
    return  render_template('page1.html',data=data)

@app.route('/page2', endpoint='page2')
def index():
    return  render_template('page2.html')

@app.route('/page3', endpoint='page3')
def index():
    return  render_template('page3.html')

if __name__ == '__main__':
    # Bind to PORT if defined, otherwise default to 5000.
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

我希望在每个页面(page1、page2、page3)上都有一个部分,显示最后访问的页面。

另外,关于这个问题 (Show recently visited html pages by any visitor),有人建议使用 cookie。这是更好的方法吗?

【问题讨论】:

    标签: python html heroku flask


    【解决方案1】:

    如果您想存储用户的页面访问/URL 历史记录,您可以使用会话。每次请求后,将访问的 URL 存储在会话中。比如:

    必须设置密钥才能使用会话

    app.secret_key = 'some secret key'
    

    登录函数,您可以在其中初始化会话变量。

    def login():
        session['username'] = "someuser"
        session['urls'] = []
    

    下面的函数使用 after_request 装饰器来存储每个用户请求后访问的 url。

    @app.after_request
    def store_visted_urls():
        session['urls'].append(request.url)
        if(len[session['urls']) > 5:
            session['urls'].pop(0)
        session.modified = True
    

    查看功能以显示最后访问的页面

    @app.route('/')
    def index():
    
    data = []
    if 'urls' in session:
    data = session['urls']
    return  render_template('page1.html',data=data)
    

    【讨论】:

    • 我认为我必须在应用程序的开头'从烧瓶导入 after_request'?烧瓶文档说“注册一个函数以在每个请求之后运行。您的函数必须采用一个参数,一个 response_class 对象并返回一个新的响应对象或相同的”我是否必须将一些参数传递给 after_request?另外,你为什么使用星号?当我实现您的代码时,我的应用无法加载(无法提供页面)。
    • 忽略星号。粘贴到此处时,我无法格式化代码示例。 after_request 只是一个 python 装饰器。您可以使用它,因为您应该已经导入了烧瓶模块。同样要为页面提供服务,您需要使用路由装饰器。我之前没有为此提供示例。查看更新
    • 我更新了代码以显示我的样子。 after_request 装饰器仍然不满意。我是否必须做其他事情才能让会话引用密钥?是不是因为 session[] 没有key,flask app 不能运行的问题?
    • 除非您登录,否则不会设置会话['urls']。所以在你的索引视图中,你应该首先检查键。
    • 另外,你可以设置 app.debug = TRUE 来查看实际的错误堆栈跟踪吗?
    【解决方案2】:

    试试这个:

    url = request.url
    if 'urls' in session:
        urls_list = session['urls']
        if not url in urls_list:
            urls_list.append(url)
            if len(urls_list) > 5:
                urls_list.pop(0)
                session['urls'] = urls_list
    else:
         session['urls'] = [url]
    

    【讨论】:

    • 欢迎来到 StackOverflow!请编辑您的帖子以包含对代码的解释。这将使您的答案更有用,更有可能被点赞:)
    猜你喜欢
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多