《Flask Web开发》 个人笔记

第01章 安装

  • flask 是一个小型框架,甚至可称为“微框架”。但这并不意味它比其他框架功能少,它是一个可扩展的框架。flask 有一个包含基本服务的核心,其他功能可以通过扩展实现。
  • 安装flask最便捷方式是用虚拟环境,也就是python解释器的一个私有副本。环境中可以安装私有包,且不会影响系统中安装的全局python解释器。
  • 虚拟环境安装:
    ①通过 virtualenv --version 查看是否安装过virtualenv,出错则没有安装
    ②apt-get install python-virtualenv 安装
  • flask安装:pip install flask
  • 如果要安装python3可用的flask,通过pip3 install flask
  • 想知道是否正确安装flask,进入python,然后import flask看有没有错误提醒

第02章 程序的基本结构

  • flask程序,需要创建一个Flask类对象。
  • Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。在大多数程序
    中,Python 的__name__ 变量就是所需的值。
from flask import Flask
app = Flask(__name__)
  • 客户端(例如Web 浏览器)把请求发送给Web 服务器,Web 服务器再把请求发送给Flask程序实例。
  • 程序实例需要知道对每个URL 请求运行哪些代码,所以保存了一个URL 到Python 函数的映射关系。处理URL 和函数之间关系的程序称为路由
  • 下面例子,把index函数注册为程序根地址的处理程序。例如部署该程序的服务器域名为www.example.com,在浏览器中访问http://www.example.com 后,会触发服务器执行index() 函数。
    像index()这样的函数称为视图函数(view function),函数的返回值称为响应,是客户端会收到的内容。
@app.route('/')
def index():
    return '<h1>Hello World!</h1>'
  • 下列尖括号里的内容是动态部分
@app.route('/user/<name>')
def user(name):
    return '<h1>Hello, %s!</h1>' % name
  • 路由中的动态部分默认使用字符串,不过也可使用类型定义。例如,路由/user/<int:id>只会匹配动态片段id 为整数的URL。Flask 支持在路由中使用int、float 和path 类型。path 类型也是字符串,但不把斜线视作分隔符,而将其当作动态片段的一部分。
  • 通过run方法启动flask集成的开发Web服务器。__name__=='__main__' 是Python 的惯常用法,在这里确保直接执行这个脚本时才启动开发Web 服务器。如果这个脚本由其他脚本引入,程序假定父级脚本会启动不同的服务器,因此不会执行app.run()。
if __name__ == '__main__':
    app.run(debug=True)
  • 一个完整的flask程序(hello.py,下文会有import hello)
from flask import Flask
app = Flask(__name__)

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

@app.route('/user/<name>')
def user(name):
    return '<h1>Hello,%s!</h1>' % name

if __name__ == '__main__':
    app.run(debug=True)
  • 从客户端收到请求时,需要让视图函数能访问请求对象(封装了客户端发送的HTTP请求)。可以把请求对象作为参数传入视图函数,但这样会让视图函数变得很乱。为此,Flask使用上下文临时把某些对象变为全局可访问。
  • Flask中有两种上下文:程序上下文和请求上下文
变量名 上下文 说明
current_app 程序上下文 当前激活程序的程序实例
g 程序上下文 处理请求时用作临时存储对象,每次请求都会重设这个变量
request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
session 请求上下文 用户会话,用于存储请求之间需要“记住”的值的词典
  • 一个使用request的例子
from flask import request
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    return '<p>Your browser is %s</p>' % user_agent

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

  • 程序上下文使用方法(python shell)
>>> from hello import app
>>> from flask import current_app
>>> current_app.name  #此时使用会出错

>>> app_ctx = app.app_context()
>>> app_ctx.push()
>>> current_app.name    #'hello'
>>> app_ctx.pop()
  • 请求调度:程序收到客户端发来的请求时,要找到处理该请求的视图函数。为了完成这个任务,Flask会在程序的URL 映射中查找请求的URL。URL 映射是URL 和视图函数之间的对应关系。Flask 使用app.route 修饰器或者非修饰器形式的app.add_url_rule() 生成映射。
  • 下图所示:

    ①/ 和/user/<name> 路由在程序中使用app.route 修饰器定义。/static/<filename> 路由是Flask 添加的特殊路由,用于访问静态文件(第3章)。

    ②URL 映射中的HEAD、Options、GET 是请求方法,由路由进行处理。Flask 为每个路由都指定了请求方法,这样不同的请求方法发送到相同的URL 上时,会使用不同的视图函数进行处理。HEAD 和OPTIONS 方法由Flask 自动处理,因此可以这么说,在这个程序中,URL映射中的3 个路由都使用GET 方法。

  • 为了避免在每个视图函数中都使用重复的代码,Flask 提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用。
  • 请求钩子使用修饰器实现。Flask 支持以下4 种钩子:
    before_first_request:注册一个函数,在处理第一个请求之前运行。
    before_request:注册一个函数,在每次请求之前运行。
    after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
    teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。
  • 在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g。
  • 视图函数的返回值会作为响应内容。除了字符串返回值,HTTP 响应中一个很重要的部分是状态码,Flask 默认设为200,这个代码表明请求已经被成功处理。如果视图函数返回的响应需要使用不同的状态码,那么可以把数字代码作为第二个返回值,添加到响应文本之后。例如,下述视图函数返回一个400 状态码,表示请求无效:
@app.route('/')
def index():
    return '<h1>Bad Request</h1>', 400
  • 如果不想返回由1 个、2 个或3 个值组成的元组,Flask 视图函数还可以返回Response 对象。make_response() 函数可接受1 个、2 个或3 个参数(和视图函数的返回值一样),并返回一个Response 对象。
  • 下例创建了一个响应对象,然后设置了cookie:
from flask import make_response

@app.route('/')
def index():
    response = make_response('<h1>This document carries a cookie!</h1>')
    response.set_cookie('answer', '42')
    return response
  • 有一种名为重定向的特殊响应类型。这种响应没有页面文档,只告诉浏览器一个新地址用以加载新页面。重定向经常在Web 表单中使用(第4章)。
  • 重定向经常使用302 状态码表示,指向的地址由Location 首部提供。重定向响应可以使用3 个值形式的返回值生成,也可在Response 对象中设定。不过,由于使用频繁,Flask 提供了redirect() 辅助函数,用于生成这种响应:
from flask import redirect

@app.route('/')
def index():
    return redirect('http://www.example.com')
  • 还有一种特殊的响应由abort 函数生成,用于处理错误。在下面这个例子中,如果URL 中动态参数id 对应的用户不存在,就返回状态码404:
from flask import abort

@app.route('/user/<id>')
def get_user(id):
    user = load_user(id)
    if not user:
        abort(404)
    return '<h1>Hello, %s</h1>' % user.name
  • Flask 的开发Web 服务器支持很多启动设置选项,但只能在脚本中作为参数传给app.run()函数。这种方式并不十分方便,传递设置选项的理想方式是使用命令行参数。
  • Flask-Script 是一个Flask 扩展,为Flask 程序添加了一个命令行解析器。Flask-Script 自带了一组常用选项,而且还支持自定义命令。
  • 安装:pip install flask-script
  • 使用例子:
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app)

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

@app.route('/user/<name>')
def user(name):
    return '<h1>Hello,%s!</h1>' % name

if __name__ == '__main__':
    manager.run()
  • 这种情况下,运行会提示你部分可用的命令行

  • shell 命令用于在程序的上下文中启动Python shell 会话。你可以使用这个会话中运行维护任务或测试,还可调试异常。
  • runserver 命令用来启动Web 服务器。运行python hello.py runserver 将以调试模式启动Web 服务器
  • --help可用看到更多命令行提示:

第03章 模版

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/82262385