1. 安装Flask

1.1 安装虚拟环境

mkdir myproject
cd myproject
py -3 -m venv venv
#Linux系统: python3 -m venv venv

 1.2 激活虚拟环境

venv\Scripts\activate
#Linux中: . venv/bin/activate

 1.3 安装Flask

(venv) D:\Tmp\myproject>pip install Flask
2. 第一个Flask程序
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'hello world'

if __name__ == '__main__':
    app.run()

初始化:app = Flask(__name__)

  Flask类只需要有个构造参数即主模块或包的名字,这个参数决定程序的根目录,以便找到相对于根目录的资源文件,这个大部分情况__name__就是所需要的值。

 路由:@app.route('/')

  处理函数和和URL的关系,Flask通过修饰器把函数注册为路由。访问http://localhost:5000就会调用index这个视图函数  

访问:http://127.0.0.1:5000,页面即可得到hello world.

 

 默认只能本机访问,可以修改端口和允许的主机:app.run(host = '0.0.0.0',port = 7777,debug = True )

 3.上下文

   Flask有程序上下文和请求两种上下文,Flask使用上下文把一些对象设置为在一个线程内全局可访问。

flask angular架构图_映射关系

Flask在分发请求之前,激活或者说推送程序和请求上下文,请求处理完后进行删除。注意一定要激活才可以使用上下文。

flask angular架构图_数据库_02

4. 请求调度

   查看URL和处理函数的映射关系:

flask angular架构图_python_03

  这里有一个特殊的映射关系/static/<filename>,这是Flask添加的特殊路由,用于访问静态文件。url_for('static', username='js/test.js')

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login():
    return 'login'

@app.route('/user/<username>')
def profile(username):
    return '{}\'s profile'.format(username)

with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))

/
/login
/login?next=/
/user/John%20Doe

5. 请求钩子

   钩子用于处理请求之前或者之后,比如说请求开始前建立数据库连接,Flask支持下面四种钩子:

flask angular架构图_flask_04

6. 响应

6.1 响应状态码

@app.route('/')
def index():
    return '<h1>Hello World!</h1>',400

6.2  返回respones对象

@app.route('/')
def index():
    response = app.make_response('<h1>This document carries a cookie</h1>')
    response.set_cookie('name', 'scott')
    return response

6.3 重定向

from flask import redirect
app = Flask(__name__)

@app.route('/')
def red():
    return redirect('https://www.baidu.com')

 6.4 abort函数处理错误

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()

7. 渲染模板

从Python内部生成HTML并不好玩,而且实际上非常麻烦,因为您必须自行执行HTML转义以保持应用程序的安全。因为Flask 自动为你配置Jinja2模板引擎。

要呈现模板,您可以使用该render_template() 方法。您所要做的就是提供模板的名称以及想要作为关键字参数传递给模板引擎的变量。以下是如何呈现模板的简单示例:

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)
8. HTTP方法

根据不同的请求方法,执行不同的方法。

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

9. request

@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)

 要访问在URL(?key=value)中提交的参数,您可以使用 args属性:

searchword = request.args.get('key', '')

10. 文件上传 

from flask import request
from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        #尽可能以原名字命名,中文会被去掉
        f.save('/var/www/uploads/' + secure_filename(f.filename))