【问题标题】:Flask: Set session cookie based on domain nameFlask:根据域名设置会话cookie
【发布时间】:2014-04-17 07:48:40
【问题描述】:

我是 Flask 和 python 的新手,我正在做一个项目,我们有一个可以通过两个不同域访问的网站。代码库相同,但域的品牌不同。我需要加载一个特定于域的样式表,并且在几个模板块中我需要使用一些条件来仅在我位于某个域时显示一些内容。

我认为最好的方法是根据域创建一个会话变量(欢迎提出其他建议)。当访问者进入其中一个域时,它会被设置,然后我可以使用条件来加载适当的样式表/代码块。

不过,我无法让它正常工作。现在在我的 app.py 文件中,我有一个“客户端”会话变量,该变量是根据在每个请求之前调用的 url 参数设置的:

@app.before_request
def set_client_session():
    if 'client' in request.args:
        session['client'] = request.args['client']

如何使用域而不是 URL 参数来设置它,以及如何在模板中检查它的值,以便有条件地加载样式表/代码块?

完整的 app.py 文件:

import os
import json
from flask import Flask, session, request, render_template

app = Flask(__name__)

# Generate a secret random key for the session
app.secret_key = os.urandom(24)

@app.before_request
def set_client_session():
    if 'client' in request.args:
        session['client'] = request.args['client']

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/edc')
def abc():
    return render_template('pages/abc.html')

@app.route('/success')
def success():
    return render_template('success.html')

@app.route('/contact')
def contact():
    return render_template('pages/contact.html')

@app.route('/privacy')
def privacy():
    return render_template('pages/privacy.html')

@app.route('/license')
def license():
    return render_template('pages/license.html')

@app.route('/install')
def dcm_download():
    return render_template('pages/install.html')

@app.route('/uninstall')
def uninstall():
    return render_template('pages/uninstall.html')

if __name__ == '__main__':
    app.run(debug=True)

【问题讨论】:

    标签: python flask session-variables session-cookies


    【解决方案1】:

    您可以使用request.headers['Host'] 访问域/主机名,然后将其设置为会话。

    @app.before_request
    def set_domain_session():
        session['domain'] = request.headers['Host']
    

    此外,request.url_root 会为您提供域和协议,以备不时之需。 (例如http://domain.com/

    然后在 jinja2 模板中,您可以访问会话变量并检查域。

    {% if session.domain == 'domain1.com' %}
        <link rel="stylesheet" href="{{ url_for('static', filename='css/domain1.css') }}">
    {% else %}
        <link rel="stylesheet" href="{{ url_for('static', filename='css/domain2.css') }}">
    {% endif %}
    

    【讨论】:

    • 域设置正确,但条件不正确。我正在本地开发服务器上工作,所以现在域是 localhost:5000。当我检查 session.domain == 'localhost:5000' 的值时,它返回 false。如果我只检查是否有 session.domain,它会返回 true。当我输出 {{session.domain}} 时,肯定是 localhost:5000,所以出于某种原因检查 session.domain == 'localhost:5000' 是否不起作用。
    • 很奇怪。我只是自己测试了它以确保它运行良好。 {{ session.domain == 'localhost:5000' }} 相等性检查最终返回 True。这很愚蠢,但尝试做{{ 'a' == 'a' }} 看看它是否返回True
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2011-12-23
    • 2013-11-10
    • 2012-07-28
    相关资源
    最近更新 更多