Python Flask学习知识点(三)

timg (7).jpg

在上一节Python Flask学习知识点(二)文章中,
把视图函数从入口启动文件中分离了出来,把视图函数放到了book.py模块中,但是通过尝试,无法从启动文件run.py中导入Flask核心对象app,这也就导致无法使用Flask核心对象来注册视图函数的路由,解决这个问题的方法有很多种。

引入蓝图概念

Flask提供了一种机制,叫做蓝图(blueprint)

Flask 中的蓝图为这些情况设计:

  • 把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。
  • 以 URL 前缀和/或子域名,在应用上注册一个蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
  • 在一个应用中用不同的 URL 规则多次注册一个蓝图。
  • 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或者视图函数。
  • 初始化一个 Flask 扩展时,在这些情况中注册一个蓝图。
层级关系如下图:
image.png

Flask中,app可以看作是一个插线板,上边可以插很多的蓝图,蓝图不能独立存在,必须插入到Flask核心对象app中;
app也可以插入很多Flask插件;
蓝图下边是视图函数,还可以指定静态文件夹和模板文件夹。
我们可以注册很多蓝图,把分类不同的视图函数注册到特定的蓝图上,例如:book.py中的视图函数可以注册到它的蓝图上。


image.png

上图中,web这个层级就是蓝图。

from flask import Flask

app = Flask(__name__)
app.config.from_object('config')
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=app.config['DEBUG'], port=83)

随着项目扩展增大,需要在Flask核心对象app上注册各种各样插件,包括蓝图,也就是说初始化代码会越来越复杂,当代码变复杂是,就要想办法去简化、优化、分离,所以现在要把Flask初始化操作从启动文件中分离出去。
在app文件夹下新建__init__.py文件,

from flask import Flask

def create_app():
    app = Flask(__name__)
    app.config.from_object("config")
    return app

然后在run.py中导入app

from app import create_app

app = create_app()
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=app.config['DEBUG'], port=81)

至此,应用级别的初始化完成。

用蓝图注册视图函数

蓝图初始化:
在web文件夹下新建__init__.py,蓝图有关的初始化都放到这里。
编辑book.py文件:

from flask import jsonify, Blueprint

web = Blueprint('web', __name__)

@web.route('/hello')
def search():
    result = {'key1': 'a'}
    return jsonify(result)

上边代码,把视图函数注册到了蓝图上,接着,要把蓝图注册到Flask核心对象app上,
蓝图注册到app上是关于app的操作,所以放到app文件夹下__init__.py中,更改__init__.py:

from flask import Flask


def create_app():
    app = Flask(__name__)
    app.config.from_object("config")

    register_blueprint(app)
    return app


def register_blueprint(app):
    from app.web.book import web
    app.register_blueprint(web)

运行run.py可以得到视图函数返回的JSON
可以debug调试看下:


image.png

url_map和view_functions都有对应值,由于是因为视图函数注册到蓝图,蓝图再到app,所以显示为蓝图名称web下的search视图函数。

单蓝图多模块

上边代码中,在web这个蓝图中只有一个模块book.py,如果我们要想再增加一个user.py模块,就必须再创建一个蓝图,显然不合理,这是wo

蓝图其实是在大型工程中分拆不同模块的。
怎么理解上边这句话?


image.png

上边截图中,app文件夹之下的三个文件夹可以视为三个蓝图,
web:提供给网站相关模板和文件
api:给移动端提供数据
cms:提供内容管理

如何在同一个蓝图下,把视图函数拆分到不同模块?
把book.py中蓝图的代码放到web文件夹下__init__.py中:

from flask import Blueprint

# 蓝图
web = Blueprint("web", __name__)

再更改book.py

from flask import jsonify
from . import web
__author__ = 'Allen'


@web.route('/hello/')
def search():
    result = {'key1': 'ab'}
    return jsonify(result)

至此,就实现了同一个蓝图下,把视图函数拆分到不同模块。

Flask中request对象

视图函数传参方式,
先看第一种:

from flask import jsonify
from . import web

@web.route('/hello/<q>/<page>')
def search(q, page):
    result = {q: page}
    return jsonify(result)

访问127.0.0.1:81/hello/a/b,返回的是{"a":"b"}
(这里提示下,如果访问404,浏览器清空缓存再试)

现在改写URL传参模式,改成这样:127.0.0.1:81/hello?q=小明&page=3
代码就要这么写:

from flask import jsonify, request
from . import web


@web.route('/hello/')
def search():
    q = request.args['q']
    page = request.args['page']
    result = {"name": q, "valus": page}
    return jsonify(result)

导入Flask内置的request对象来获取传入的参数q和page
绝大多数的web框架中管理http请求和响应时,都需要这样的类,一个是request,一个是response
request中包含了很多信息,包含全部的HTTP请求信息,GET POST 访问来源的ip(remote ip),这里只举着几个例子,其余的请查看文档。
request.agrs并不是dict而是dict子类,所以可以像访问字典那样访问数据,最大特点是不可变,元组和字符串是可变如果想要实现不可变字典 ,可以自己继承dict写方法,但是Flask中已经内置了这种方法,request.args.to_dict() flask字典转换为常见普通字典。
request使用必须是在flask上下文环境中,是由http请求触发的,因为flask request使用的代理模式,这个后续会深入讲解。
欲知后事如何,请看下回分解,记得点个赞~感谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容