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

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

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

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

番外篇-实战:Flask快速入门_第1张图片
最小的可执行程序: hello.py

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

运行hello.py

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

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

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

文档中位置:Routing

1.1 定义方法

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

1.2 URL参数

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

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

番外篇-实战:Flask快速入门_第2张图片
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('

Test

')

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 列表 %}

{{ item.property }}

{% 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 %}

子模板内容

{% 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了呢?

你可能感兴趣的:(番外篇-实战:Flask快速入门)