Python的Flask框架中配置多个子域名的方法讲解
Flask子域名 modules.py: from flask import Blueprint public = Blueprint('public',__name__) @public.route('/') def home(): return 'hello flask' app.py: app = Flask(__name__) app.config['SERVER_NAME'] = 'example.com' from modules import public app.register_blueprint(public,subdomain='public') 现在可以通过public.example.com/来访问public模块了。 通配符子域 先来看段示例代码: modules.py: from flask import Blueprint member = Blueprint('member',__name__) @member.route('/') def home(): return g.subdomain app.py: app = Flask(__name__) app.config['SERVER_NAME'] = 'example.com' from modules import member app.register_blueprint(member,subdomain='<subdomain>') 这段代码和上一节的第像,不同之处是这里的subdomain使用了动态参数<subdomain>(路由中的URL变量也是这种方式)。我们可以用这个参数在请求回调函数之前利用的组合的url处理器来获取相关的用户。这样我们就可以通过*.example.com的形式来访问member模块了。 下面是为任何Flask或Blueprint对象增加子域名支持的便捷函数: def add_subdomain_to_global(endpoint,values): g.subdomain = values.pop('subdomain',None) def add_subdomain_to_url_params(endpoint,values): if not 'subdomain' in values: values['subdomain'] = g.subdomain def add_subdomain_support(app): app.url_value_preprocessor(add_subdomain_to_global) app.url_defaults(add_subdomain_to_url_params) 然后你可以使用before_request回调函数来处理子域名: add_subdomain_support(blueprint) @blueprint.before_request def add_user_to_global(): g.user = None if g.subdomain: g.user = User.query.filter_by(username=g.subdomain).first_or_404() 注:这里的blueprint请改为实际对象。 特别说明:通配符子域调试不是不太方便,需要做泛域名解析才可以。修改hosts文件来指定域名的方法是不可行的(子域名较少时可以逐个添加,子域名多了就不太现实了)。本机调试时,可以安装DNS服务器(比如LINUX BIND服务等),并做好泛域名解析,然后再进行调试。当然使用公网域名和服务器来调试也未尝不可。 PS: a=Blueprint(‘a',__name__,subdomain='a') 这样,该bp下面的所有url routing走的都是a.domain.com/xxx 2.在某个具体的url routing定义时,如果需要实用a.domain.com,那么这么写: @www.route(‘/hello',methods=['GET','POST'],subdomain='a') def xxx(): ….. 3.我在具体实践中,默认的routing都是走的www,这是在__init__.py中: app.url_map.default_subdomain='www' 其实就是设置默认子域名,这样默认不做设置的话,路由走的就是www。 server { server_name domain.com; rewrite ^(.*) http://www.domain.com$1 permanent; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |