Flask:根据域名设置会话cookie

时间:2014-03-12 21:16:52

标签: python flask session-variables session-cookies

我是对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)

1 个答案:

答案 0 :(得分:4)

您可以使用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 %}