Python学习——《FlaskWeb开发》笔记(一)

第一部分 Flask 简介

第 1 章 安装

Flask 有 3 个主要依赖:

  1. 路由、调试和 Web 服务器网关接口子系统由 Werkzeug 提供;
  2. 模板系统由 Jinja2 提供;
  3. 命令行集成由 Click 提供。

这些依赖都是 Flask 的开发者 Armin Ronacher 开发的。

原生不支持数据库访问、Web 表单验证和用户身份验证,但是可通过拓展形式实现。

  • 虚拟环境安装 pip install virtualenv

Windows 注意修改 PATH 环境变量

第 2 章 应用的基本架构

  1. 初始化应用实例

    所有来自客户端的请求都交由应用实例(Flask 类对象)处理。

  2. 路由和视图函数

    客户端(Web)浏览器把请求发送给 Web 服务器,Web 服务器再把请求发送给 Flask 应用实例。 应用实例保存 URL 请求到 Python 函数的映射关系,处理 URL 和函数之间关系的程序称之为路由

    最简单的方法(app.route)装饰器:

    1
    2
    3
    @app.route('/')
    def index()
    return '<h1>Hello World!</h1>'

    index()这样处理入站请求的函数称之为视图函数,函数的返回值称之为响应,是客户端接收到的内容。

    路由 URL 中放在尖括号里面的内容是动态部分,任何能匹配到静态部分的 URL 会映射到这个路由上,调用视图函数时, Flask 会将动态部分作为参数传入函数

    1
    2
    3
    @app.route('/user/<name>') # 任何匹配静态部分的URL都走这个路由
    def user(name): # 尖括号里的name作为参数传递进视图函数
    return '<h1>Hello, {}!</h1>'.format(name)
  3. 请求-相应循环

    1. 应用和请求上下文 请求对象封装了客户端发送的 HTTP 请求。方便使用,会通过上下文变为全局可访问。 上下文全局变量:current_app, g, request, session

    2. 请求分派 URL 映射,路由。Flask 为每个路由都制定了请求方法,这样即使不同的请求方法发送到相同 URL 上,也会 使用不同的视图函数来处理
    3. 请求对象 上下文变量 request 对外开放请求对象,包含全部信息。
    4. 请求钩子 请求钩子通过装饰器实现,四种钩子:before_request, before_first_request, after_request, teardown_request
    5. 响应 多数情况下,视图函数返回值作为响应内容。字符串,状态。response 对象。URL 重定向。
    6. Flask 扩展

第 3 章 模板

模板是包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。 使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。Jinja2

  1. 变量 大括号两层括起来的部分就是变量,可以识别复杂类型,加过滤器(渲染时事变变换),如|capitalize, |lower ,|upper, |title, |trim, |striptags:.

    {{ name }} 表示name是等待视图函数传递的变量
    eg
    <p> A value from a dictionary : {{ mydict['key'] }}, </p>
    <p> A value from a list : {{ mylist[-1] }}, </p>
    <p> A value from a dictionary with 过滤器: {{ mydict['key']|striptags: }}, </p>
  2. 控制结构

    条件判断

    {% if user %}
                Hello, {{ user }}
            {% else %}
                Hello. Stranger
            {% endif %}

    初步尝试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    {% extends "bootstrap/base.html" %} {% block title %}Flasky{% endblock %} {%
    block navbar %}
    <div class="navbar navbar-inverse" role="navigation">
    <div class="container">
    <div class="navbar-header">
    <button
    type="button"
    class="navbar-toggle"
    data-toggle="collapse"
    data-target=".navbar-collapse"
    >
    <span class="sr-only">Toggle navigation</span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    </button>
    <a class="navbar-brand" href="/">Flasky</a>
    </div>
    <div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
    <li><a href="/">Home</a></li>
    </ul>
    </div>
    </div>
    </div>
    {% endblock %} {% block content %}
    <div class="container">
    <div class="page-header">
    {% if name == "ryx" %} {# 注意==符号还有 双引号 #}
    <h1>Hello, 大哥 {{ name|striptags: }}!</h1>
    {% else %}
    <h1>Hello, 小老弟 {{ name|striptags:}}!</h1>
    {% endif %}
    </div>
    </div>
    {% endblock %}