Flask:根据域名设置会话cookie
我刚开始学习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 %}