flask框架蓝图和子域名配置详解

本文实例讲述了flask框架蓝图和子域名配置。分享给大家供大家参考,具体如下:

蓝图

在flask项目中,我们所有的url和视图函数都写在一个文件app.py中,但是当我们的项目大起来之后,这显然就不是一个合理的结构了。而蓝图就可以优雅的帮我们实现这个需求,对我们的项目进行分块。

比如现在的豆瓣网,https://www.douban.com/,他分为好几个模块。

有读书,电影,音乐,同城,FM等模块,假设我们也需要实现一个类似的网站,用过Django框架的朋友都知道,可以给每个模块新建一个app,然后相应模块的代码写在对应的app中,这样也很方便我们对代码的管理,和后期项目维护,但是在flask中呢。如果我们把所有的代码都放在app.py文件中的话,那么肯定不好管理和维护。所以我们需要对网站模块化,每个模块写在对应的为止。这里就会使用到我们的蓝图了。

首先我们在项目的跟目录下新家一个包blueprints,用啦存放我们所有的蓝图(模块)。然后在这个包里面新建book.py,movie.py,music.py,FM.py文件,对应我们上面读书,电影,音乐,FM几个模块。

然后我们在这些文件里面开始编写代码。

book.py

from flask import Blueprint
book_bp = Blueprint('book',__name__)
@book_bp.route('/book/')
def index():
 return 'book index'

movie.py

from flask import Blueprint
movie_bp = Blueprint('movie',__name__)
@movie_bp.route('/movie/')
def index():
  return 'movie index'

music.py

from flask import Blueprint
music_bp = Blueprint('music',__name__)
@music_bp.route('/music/')
def index():
  return 'music index'

FM.py

from flask import Blueprint
FM_bp = Blueprint('FM',__name__)
@FM_bp.route('/fm/')
def index():
  return 'FM index'

代码解析

  • Blueprint():实例化一个蓝图对象,第一个参数为我们蓝图的名字,第二个参数为蓝图这个拉努文件的位置,我们直接写__name__就可以了。所以其实蓝图的实例对象和app.py中的flask实例化对象app都一样,只是多了一个参数,蓝图的名字而已,使用起来都是一样的。
  • Blueprint(‘xxx',name).route():和app.route()用法一样,没有任何差别。

这样,我们就在定义好了4个蓝图,然后我们需要在app.py中区注册蓝图。

app.py

from flask import Flask,url_for,jsonify,render_template
from flask import views
# 首先导入我们的蓝图
from blueprints.movie import movie_bp
from blueprints.FM import FM_bp
from blueprints.music import music_bp
from blueprints.movie import movie_bp
app = Flask(__name__)
# app.config['SERVER_NAME'] = 'xujin.com:5000'
app.register_blueprint(movie_bp)
app.register_blueprint(FM_bp)
app.register_blueprint(music_bp)
app.register_blueprint(movie_bp)
if __name__ == '__main__':
  app.run()

然后我们运行项目,输入对应的url,就能访问到我们的视图了。这样,我们就对我们的项目进行了模块化处理。方便我们的后期维护。

1. url前缀

有时候我们需要个一些模块下的视图函数添加一些url前缀,比如说当访问电影模块下面的视图的时候,url都有一个前缀movie,例如127.0.0.1:5000/movie/index/,127.0.0.1:5000/movie/list/。。。当然我们可以手动的在每一个视图函数之前添加movie前缀,但是这样肯定不是最好的选择。那么在flask中,有没有更好的实现方式呢?答案当然是有的。在我们初始化蓝图的时候,还有一个参数url_prefix,当我们指定这个参数之后,就会给我们的movie模块写的所有视图函数添加一个前缀了。

movie.py

from flask import Blueprint
movie_bp = Blueprint('movie',__name__,url_prefix='/movie')
@movie_bp.route('/movie/')
def index():
  return 'movie index'

注意:

  • url_prefix参数必须以'/'开始。
  • 当我们传入了url_prefix参数之后,我们访问index视图的时候,url就变为127.0.0.1:5000/movie/movie/了。

2. 蓝图中模板查找规则

首先会去根目录下的templates文件夹下面查找模板,如果找到了,那么就直接返回,如果没有找到,那么就会去该蓝图的同级目录下的templates文件下寻找模板。如果找到了,也返回,如果没有,就直接报错。

3. 蓝图中静态文件查找规则

在模板中,我们使用url_for加载静态文件的时候。需要加上我们的蓝图名.

<!-- 去蓝图下面的static文件夹下寻找静态文件 蓝图名.static -->
<link rel="stylesheet" href="{{ url_for('movie.static',filename='index.css') }}" rel="external nofollow" >
<!-- 根目录下的static文件夹下寻找静态文件 -->
<link rel="stylesheet" href="{{ url_for('static',filename='index.css') }}" rel="external nofollow" >

4. 蓝图中使用url_for

我们知道在模板中加载静态文件的时候,需要蓝图的名字+ . + static这样才能加载蓝图下面的静态文件。那么我们在视图中怎样使用url_for呢?

其实和模板中使用方法一样,都需要蓝图的名字。例如,得到movie模块下index的url。

# 蓝图的名字 + . + 站点名(函数的名字)
url_for('movie.index')

子域名

子域名下载很多网站都是使用了,还是比如我们的额豆瓣,大家可以看到,读书模块下的网址都是book.douban.com,电影下面的都是movie.douban.com。那么我们也可以这样定义我们的额子域名。

比如我们定义我们的电影模块的子域名为movie。子域名的实现也是通过蓝图来实现的。我们只需要在初始化蓝图对象的时候,传入一个参数就可以了。

movie.py

from flask import Blueprint
movie_bp = Blueprint('movie',__name__,subdomain='movie')
@movie_bp.route('/movie/')
def index():
  return 'movie index'

我们还得在app.py中配置服务器的名字。

app.config['SERVER_NAME'] = '127.0.0.1:5000'

然后我们怎样访问我们movie模块中的额视图函数呢?movie.127.0.0.1:5000/movie/这样吗?

我们来尝试一下,在浏览器中输入网址。然后我们发现并访问不了?是我们没有配置正确吗?

答案当然是否定的。这是因为127.0.0.1不支持子域名额配置,那么localhost支持吗?localhost也是不支持的?

那我们怎么测试我们到底有没有配置正确呢?难道要去买一个域名?

当然不用,我们修改一下我们电脑的hosts文件就可以了。

windows下hosts文件存放位置为C:\Windows\System32\drivers\etc\hosts

我们打开这个文件,在最下面添加代码

# 访问xxx.com的时候 就会找到127.0.0.1
127.0.0.1 xxx.com  # 标准域名配置
127.0.0.1 movie.xxx.com # 子域名配置

如果提示没有权限修改这个文件,就在外面重新新建一个文件hosts,然后把hosts里面的代码复制进去,在添加我们的代码。然后将hosts文件删除,再讲我们新建的hosts放进去。

然后app.py中配置我们的域名。

app.config['SERVER_NAME'] = 'xxx.com:5000'

这样,我们访问我们网站的时候,就可以使用xxx.com:5000/这个域名来访问了。我们访问movie模块的时候,也就可以使用movie.xxx.com:5000这个子域名访问了。

希望本文所述对大家基于flask框架的Python程序设计有所帮助。

(0)

相关推荐

  • flask框架配置mysql数据库操作详解

    本文实例讲述了flask框架配置mysql数据库操作.分享给大家供大家参考,具体如下: 该篇博客配置环境为:python版本3.5,flask2.0,python3中已经不再支持MySQLdb模块,所有这里我用了pymysql,所有使用前应该 安装pymysql: pip install pymysql 在网上的好多资料都给的是使用sqlite的例子,由于很不喜欢所以今天分享一下flask-sqlalchemy操作mysql的方法. 以前习惯使用sqlalchemy,后来发现使用flask-sq

  • Python的Flask框架中SERVER_NAME域名项的配置教程

    Flask中的SERVER_NAME主要做两件事: 协助Flask在活动的请求(request)之外生成绝对URL(比如邮件中嵌入网站URL) 用于子域名支持 很多人误以为它可以做这两件事之外的其它事情. 一.第一件事:绝对URL 我们知道,url_for默认情况下是生成相对URL,它有个参数_external,如果设置为真,则会生成一个绝对URL(就是HTTP开头带域名等信息的).若不指定SERVER_NAME,默认使用当前活动的请求(request)来生成URL. 下面举个例子演示一下: #

  • 在python的WEB框架Flask中使用多个配置文件的解决方法

    有些框架本身就支持多配置文件,例如Ruby On Rails,nodejs下的expressjs.python下的Flask虽然本身支持配置文件管理, 但单纯使用from_object和from_envvar却不是那么方便.有没有更好的办法? 答案是Flask-Environments这个包.它能通过FLASK_ENV环境变量自动选择开发环境配置或生产环境配置.使用之前要先安装: 复制代码 代码如下: $ sudo pip install Flask-Environments 然后修改confi

  • 在阿里云服务器上配置CentOS+Nginx+Python+Flask环境

    项目运行环境 阿里云(单核CPU, 1G内存, Ubuntu 14.04 x64 带宽1Mbps), 具体购买和ssh连接阿里云本文不做描述. 实用工具 首先进入阿里云后先要升级下apt-get, 并下载所需软件 sudo apt-get update sudo apt-get install vim git wget tmux 我还会使用zsh和oh-my-zsh来替换bash sudo apt-get install zsh # 终端下打以下命令 wget --no-check-certif

  • Flask框架响应、调度方法和蓝图操作实例分析

    本文实例讲述了Flask框架响应.调度方法和蓝图操作.分享给大家供大家参考,具体如下: 响应 像现在大部分的互联网应用用的数据传输格式都是JSON,当用户访问一个URL,我们如何通过Flask返回JSON的响应: 普通做法: @app.route("/") def showInfo(): return jsonify({"name":"老王","age":18}) 当我们的应用有大量的URL时,我们需要每次都用jsonify转

  • Flask框架配置与调试操作示例

    本文实例讲述了Flask框架配置与调试操作.分享给大家供大家参考,具体如下: 配置管理 复杂的项目需要配置各种环境.如果设置项很少,可以直接硬编码进来,比如下面的方式: app = Flask(__name__) app.config['DEBUG'] = True app.config是flask.config.Config类的实例,继承自Python内置数据结构dict,所以可以使用update方法: app.config.update( DEBUG = True, ... ) app.co

  • 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' fr

  • 解决python flask中config配置管理的问题

    在项目中我们需要配置各种环境.如果我们的配置项很少的话,可以直接简单粗暴的来: 比如: app =Flask(__name__) app.config['DEBUG']=True app.config其实是实例化了flask.config.Config类的实例, 继承于python内置数据结构dict字典,可以使用update方法: app.config.update( DEBUG=true, SECRET_KEY='xxxx' ) 如果设置很多的情况下,想要集中起来管理设置项, 应该将他们存放

  • flask中使用蓝图将路由分开写在不同文件实例解析

    本文的内容主要是flask中使用蓝图将路由分开写在不同文件的相关介绍,具体如下. Flask 用 蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通用的模式.蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法.一个Blueprint 对象与Flask 应用对象的工作方式很像,但它确实不是一个应用,而是一个描述如何构建或扩展应用的蓝图 . Flask 中的蓝图为这些情况设计: 把一个应用分解为一个蓝图的集合.这对大型应用是理想的.一

  • Python基于Flask框架配置依赖包信息的项目迁移部署

    一般在本机上完成基于Flask框架的代码编写后,如果有接口或者数据操作方面需求需要把代码部署到指定服务器上. 一般情况下,使用Flask框架开发者大多数都是选择Python虚拟环境来运行项目,不同的虚拟环境中配置依赖包信息不同.如果重新迁移到一个新的虚拟环境后,又重新来一个一个的配置依赖包,那将会很浪费时间. 下面介绍一个简单易用的技巧,也是我自己在书本上看到的,以防每次配置需要翻阅书籍的麻烦,所以单自写一篇文章作记录,方便自己以后查看,也希望给其他学习的同学有点帮助. 完成项目相关代码编写后,

  • Flask配置Cors跨域的实现

    1 跨域的理解 跨域是指:浏览器A从服务器B获取的静态资源,包括Html.Css.Js,然后在Js中通过Ajax访问C服务器的静态资源或请求.即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源. 同源策略是指:浏览器A从服务器B获取的静态资源,包括Html.Css.Js,为了用户安全,浏览器加了限制,其中的Js通过Ajax只能访问B服务器的静态资源或请求.即:浏览器A从哪拿的资源,那资源中就只能访问哪. 同源是指:同一个请求协议(如:Http或Https).同一个Ip.同一个端口,3个全

随机推荐