番外篇-实战:Flask快速入门

本篇我们运用<Web框架如何快速入门>的原理来制作一篇Python-Flask框架的快速入门指南来实战之前的原理, 希望看完这次实战的过程, 你可以根据你想要学习的框架的文档和网络资料来做好自己的快速入门计划.

首先找到Flask的官方文档:  http://flask.pocoo.org 

首先找到如何启动一个最小规模的可以运行的Helloword

最小的可执行程序: hello.py

在hello.py所在的目录运行程序

运行hello.py

完成上面步骤就可以开始入门之旅了.

一. 定义控制器和配置路由

Flask 中的控制器就是一个简单的函数, 控制器的路由配置通过给函数加上装饰器来实现.

文档中位置:Routing

1.1 定义方法

@app.route('URL', methods=[允许接收的HTTP方法列表])

1.2 URL参数

在URL中带有<参数名>这样的部分或者<参数名:参数类型>这样的写法, 就可以在URL中定义参数, 比如 '/get_file/<file_name>' 或者 '/get_file_by_id/<file_id:int>'.

定义了参数的URL路由对应的函数, 必须包含对应的参数, 比如

URL参数

参数如果带了类型, 必须是下面几种类型之一:

1) string 不能包含反斜杠

2) int 整数

3) float 浮点数或者整数

4) path 包含反斜杠在内的字符串

5) any 所有的字符

6) uuid 只允许uuid字符串

如果定义了类型, flask会将传入的参数转换成对应的类型.

二. 输入输出

大部分获取环境数据的方法都是通过flask的request对象类获取的, 详细文件可以参见:传送门

而输出的对象是flask的Response类的实例, 可以通过make_response来生成, 详细的文档可见:传送门

2.1. 如何获取Query String参数?

from flask import request

request.args.get('name')

request是当前请求的flask.Request类的实例. 属性args可以当作一个字典来访问.

2.2.如何获取Form表单的数据(Json body)?

from flask import request

request.form.get('name')

form属性是封装过的类似字段的数据类型, 支持一个key有多个值, 当一个key有多个值的时候, 通过key获取到的是一个数组, 包含了所有这个key的值.

request.json 可以获取用Json body方式提交的数据, request.is_json 可以用来检测body里是不是json类型的数据.

原始的body数据通过 request.data 访问

2.3. 如何读取和修改cookie?

from flask import request

request.cookies.get('name')

cookies是一个类似字典的数据结构, 按照字典的方式访问即可. 这个字典是只读的, 所以设置cookie要通过Response对象

from flask import make_response

response = make_response('<h1>Test</h1>')

response.set_cookie('name', value)

2.4. 如何获取headers?

from flask import headers

request.headers.get('Authorization')

headers是一个类似字典的数据结构, 按照字段的方式访问

2.5. 如何实现页面转跳?

from flask import redirect

redirect('url')


2.6. 如何输出Http响应?

输出模板渲染结果

from flask import render_template

@app.route('/')

def handler():

    return render_template('template_path', **locals())

输出json

from flask import jsonify

@app.route('/')

def handler():

    return jsonify(key=value...)

三. 模板引擎

flask内置了jinja2模板, 并且入上一节提供了render_template快捷方法. 只要在hello.py所在目录下创建个目录-templates, 把模板文件放进去就好了.

jinja2的模板就是一个普通的html文件, 其中加入jinja2的占位符即可.

3.1. 占位符如何定义

{{ key }}

render_template的keywords参数传入的key, 用{{ }} 括起来就是一个占位符了. 模板中新定义的变量用{{ }}括起来也是一个占位符.

3.2. 如何定义循环

{% for item in 列表 %}

<h1>{{ item.property }}</h1>

{% endfor %}


3.3. 如何定义判断条件

{% if 判断条件 %}

{% else %}

{% endif %}

3.4. 如何对占位符加过滤器

{{ variable | 过滤器名 }}

flask内置了几个过滤器 tojson和safe, 如果需要还可以自己定义自定义过滤器. 过滤器可以嵌套使用, 比如 {{ var | tojson | safe  }}

3.5. 如何定义继承模板

首先要定义一个基础模板, 比如base.html, 在其中需要继承模板替换的地方, 定义一个命名的block, 比如:

{% block name%} {% endblock %}

然后定义一个集成模板, 比如 enh.html, 第一行定义 extends 来指明继承自哪个基模板, 然后用block来覆盖基模板的相同名字的block

{% extends "base.html" %}

{% block name %}

<h1>子模板内容</h1>

{% endblock %}

3.6. 如何定义嵌套模板

{% include "snap.html" %}

四.中间件

通过装饰器将函数注册为中间件的钩子

@app.before_first_request  当第一个请求执行前执行

@app.before_request 每一个请求执行前执行

@app.after_request 每一个请求执行后执行

@app.teardown 当请求执行抛出未catch的异常后执行

五.统一错误处理

通过@app.teardown

六.鉴权和Session

flask没有提供自带的鉴权机制, 但是为了方便你自己实现鉴权, flask提供了一些机制

from flask import request

user_name = request.authorization.user_name

password = request.authorization.password

可以获取到Basic Auth的鉴权信息

Session读写

from flask import session

session[key] = value

variable = session[key]

Flask的Session是基于cookie的, 所以不要放入太大的内容

七.生产部署的方式

用gunicorn来host应用服务

pip install gunicorn

然后就可以用

gunicorn -w worker进程数量 -b 绑定IP:端口号 --timeout 执行超时时间 hello:app

的方式启动

Web服务器用Nginx, 通过Upstream把请求反向代理到gunicorn的应用服务

upstream api {

    server 127.0.0.1:端口;

}

server {

    listen 80;

    server_name 域名;

    location /static {

        root /静态文件地址;

    }

    location / {

        proxy_pass_header Server;

        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Scheme $scheme;

        proxy_redirect off;

       proxy_pass http://api;

       proxy_next_upstream error;

    }

}


按照以上套路学习完毕看是不是可以入门Flask了呢?

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,176评论 22 257
  • [TOC]一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见。最近正好时间充裕,决定试试做一下,并记录一下...
    何柯君阅读 7,179评论 3 98
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,612评论 18 399
  • 很多东西,都要在经历之后才会有所感受与收获。 没到小学见习之前,对小学的印象,全是自己念小学时的那...
    By于你与你阅读 257评论 0 0