Flask:根据域名设置会话cookie

0 投票
1 回答
5762 浏览
提问于 2025-04-17 22:01

我刚开始学习Flask和Python,现在在做一个项目,这个项目有一个网站,可以通过两个不同的域名访问。代码是一样的,但这两个域名的品牌形象不同。我需要加载一个特定于域名的样式表,并且在几个模板块中,我需要使用一些条件判断,只有在特定域名下才显示某些内容。

我觉得最好的办法是根据域名创建一个会话变量(如果有其他建议也欢迎)。这个变量在访客通过某个域名访问时设置,然后我可以用条件判断来加载合适的样式表或代码块。

不过,我在实现这个功能时遇到了一些问题。目前在我的app.py文件中,我有一个“client”会话变量,它是根据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 个回答

5

你可以通过 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 %}

撰写回答