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


Posted in Python onJanuary 25, 2020

本文实例讲述了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程序设计有所帮助。

Python 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Python3.0与2.X版本的区别实例分析
Aug 25 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Python使用OpenCV进行标定
May 08 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
python标记语句块使用方法总结
Aug 05 Python
Django 项目重命名的实现步骤解析
Aug 14 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
浅谈keras2 predict和fit_generator的坑
Jun 17 Python
浅谈Python __init__.py的作用
Oct 28 Python
基于Python实现nc批量转tif格式
Aug 14 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 #Python
如何在 Django 模板中输出 &quot;{{&quot;
Jan 24 #Python
在keras中获取某一层上的feature map实例
Jan 24 #Python
keras获得model中某一层的某一个Tensor的输出维度教程
Jan 24 #Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 #Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 #Python
keras获得某一层或者某层权重的输出实例
Jan 24 #Python
You might like
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
自荐信模版
2013/10/24 职场文书
机电一体化大学生求职信
2013/11/08 职场文书
售后客服工作职责
2014/06/16 职场文书
孩子教育的心得体会
2014/09/01 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL
Go遍历struct,map,slice的实现
2021/06/13 Golang
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server