搭建开发环境
    1.1.1 pipenv python包管理工具 pip install pipenv
    虚拟环境:通过创建虚拟环境,你可以拥有一个独立的Python解释器环
    境。这样做的好处是可以为每一个项目创建独立的Python解释器环境,
    因为不同的项目常常会依赖不同版本的库或Python版本。使用虚拟环境
    可以保持全局Python解释器环境的干净,避免包和版本的混乱.


    1. ## hello.py
    2. from flask import Flask
    3. app = Flask(__name__)
    4. @app.route('/')
    5. def index():
    6. return '<h1>Hello Flask!</h1>'

    注册路由
    route() 装饰器的第一个参数是url规则,用字符串标识,必须一斜杠开始
    一个视图函数可以绑定多个URL

    动态URL

    1. @app.route('/greet<name>')
    2. def greet(name):
    3. return '<h1>hello, %s</h1>' % name

    通过创建任意一个函数,并为其添加app.cli.command()装饰器,我们就可以注册一个flask命令

    1. @app.cli.command()
    2. def hello():
    3. click.echo('Hello Human')

    1.9 一个完整的网站,需要模板和静态文件来生成丰富的网页。模板即包含程序页面的html 文件,静态文件则是需要在HTML文件中加载的css和JavaScript文件,以及图片、字体文件等资源文件

    模板文件存放在项目根目录中templates文件中,静态文件存放在static文件夹下,这两个文件夹需要和包含程序实例的模板处于同一个目录下

    1.10 flask与mvc架构
    在MVC架构中,程序被分为三个组件:数据处理model,用户界面view, 交互逻辑controller。

    HTTP超文本传输协议:定义了服务器和客户端之间信息交流的格式和传递方式,他是万维网中数据交换的基础
    RFC request for comment 请求评议 是一系列关于互联网标准和信息文件,可以将其理解为互联网的设计文档。

    当一个用户访问一个URL,浏览器便生成对应的http请求,经由互联网发送到对应的维表服务器,web服务器接收请求,通过wsgi将http格式的请求数据转换成我们flask程序能够使用的python数据,在程序中,flask根据请求的URL执行对应的视图函数,获取返回值生成响应。响应依次经过wsgi转换生成http响应,再经由web服务器传递,最终被发出请求的客户端接收。浏览器渲染响应中包含的html和css代码,并执行JavaScript代码,最终把解析后的页面呈现在用户浏览器的窗口中。

    请求报文:
    浏览器与服务器之间交互的数据被称为报文
    服务器返回的数据成为响应报文

    URL处理:flask中url变量部分默认为string类型,但是flask提供一些转换器可以在url规则中使用
    flask内置的url变量转换器
    string int float path any uuid

    1. @app.route('goback/<int:year>')
    2. def go_back(year):
    3. return '<p>Weclome to %d!</p>' %(201 - year)

    在用法上唯一特别的是any转换器,需要在转换器后添加括号来给出可选值

    1. @app.route('/colors/<any(bule, white, red): color>')
    2. def three_colors(color):
    3. return '...'
    4. # 如果将<color>部分替换成any转换器设置之外的任意字符,会出现404错误响应
    5. # 如果你想在any转换器中传入一个预先定义的列表,可以通过格式化字符串的方式来构建url规则字符串
    6. colors = ['white','bule','red']
    7. @app.route('/colors/<any(%s):color>' % str(colors)[1:-1])

    2.2.4 请求钩子
    有时需要对请求进行预处理和后处理,这时可以使用flask提供的一些请求钩子(Hook),他们可以用来注册在请求处理的不同阶段执行的处理函数(回调函数callback)

    • before_first_request
    • before_request
    • after_request
    • teardown_request
    • after_this_request

    重定向
    使用flask提供的redirect() 函数来生成重定向响应,其状态码为302

    1. from flask import Flask, redirect
    2. # ...
    3. @app.route('/hello')
    4. def hello():
    5. return redirect('http://www.wxample.com')

    如果要在程序内重定向到其他视图,那么只需要在redirect()函数中使用url_for() 函数生成目标url即可

    1. from flask import Flask, redirect, url_for
    2. ...
    3. @app.route('/hi')
    4. def hi():
    5. ...
    6. return redierct(url_for('hello')) # 重定向到/hello
    7. @app.route('/hello')
    8. def hello():
    9. ...

    2.错误响应
    如果想手动返回错误响应,更方便的方法是使用flask提供的abort()函数

    1. from flask import Flask,abort
    2. ...
    3. @app.route('/404')
    4. def not_found();
    5. abort(404)
    6. # abort()函数前不需要使用return语句,一旦abort()函数被调用,abort()函数之后的代码将不会被执行

    使用cookie技术在存储客户端的用户信息
    set_cookie视图来设置cookie,它会将url中name变量的值设置到名为name的cookie里

    1. from flask import Flask,make_response
    2. ...
    3. @app.route('/set/<name>'):
    4. def set_cookie(name):
    5. response = make_response(redirect(url_for('hello')))
    6. response.set_cookie('name', name)
    7. return response

    模拟用户认证
    使用session模拟用户的认证功能

    1. from flask import redirect ,session, url_for
    2. @app.route('/login')
    3. def login():
    4. session['logged_in'] = True
    5. return redirect(url_for('hello'))

    验证url安全性

    1. from urlparse import urlparse, urljoin
    2. from flask import request
    3. def is_safe_url(target):
    4. ref_url = urlparse(request.host_url)
    5. test_url = urlpaese(urljoin(request.host_url, target))
    6. return test_url.scheme in ('http','https') and ref_url.netloc == test_url.netloc