本文实例讲述了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程序设计有所帮助。
flask,蓝图,子域名
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 明达年度发烧碟MasterSuperiorAudiophile2021[DSF]
- 英文DJ 《致命的温柔》24K德国HD金碟DTS 2CD[WAV+分轨][1.7G]
- 张学友1997《不老的传说》宝丽金首版 [WAV+CUE][971M]
- 张韶涵2024 《不负韶华》开盘母带[低速原抓WAV+CUE][1.1G]
- lol全球总决赛lcs三号种子是谁 S14全球总决赛lcs三号种子队伍介绍
- lol全球总决赛lck三号种子是谁 S14全球总决赛lck三号种子队伍
- 群星.2005-三里屯音乐之男孩女孩的情人节【太合麦田】【WAV+CUE】
- 崔健.2005-给你一点颜色【东西音乐】【WAV+CUE】
- 南台湾小姑娘.1998-心爱,等一下【大旗】【WAV+CUE】
- 【新世纪】群星-美丽人生(CestLaVie)(6CD)[WAV+CUE]
- ProteanQuartet-Tempusomniavincit(2024)[24-WAV]
- SirEdwardElgarconductsElgar[FLAC+CUE]
- 田震《20世纪中华歌坛名人百集珍藏版》[WAV+CUE][1G]
- BEYOND《大地》24K金蝶限量编号[低速原抓WAV+CUE][986M]
- 陈奕迅《准备中 SACD》[日本限量版] [WAV+CUE][1.2G]