linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
    • Python学习指南
  • 快速开始

    • Python: 输入与输出 (I/O)
    • Python: 异常处理 try-except
    • Python: List深入概述
    • Python: 面向对象编程(OOP)
  • Python 语法库函数

    • 语法库目录
    • 库

      • library目录
      • argparse:解析命令行参数
      • difflib:比较序列并生成差异信息
      • dnspython: DNS处理库
      • IPy:IP地址处理库
      • logging:记录和管理日志信息
      • os:访问和操作操作系统
      • psutil:系统性能信息库
      • re:正则表达式库
      • smtplib:邮件发送库
    • 函数

      • function目录
      • any() 函数
      • input 函数
      • lambda 和 map 函数
      • reversed()函数
      • zip()函数
    • 语句

      • statement目录
      • import 语句
      • Try/Exception 异常
    • 概念

      • concept目录
      • 深拷贝与浅拷贝
      • 列表、字典与元组
      • 文件读写
      • IO: 输入与输出
      • 逻辑判断与条件语句
      • OOP 面向对象:class
      • OOP: 面向对象编程
  • SQLAlchemy

    • 获取insert或者update的id
  • Pandas

    • Pandas目录
    • Pandas:基础操作
    • Pandas:数据处理与转换
    • Pandas: 数据写入 excel 表格
  • Python前端框架

    • Flask

      • 1. Flask简介
      • 2. Flask程序基本结构
      • 3. Flask请求-响应循环
      • 4. flask案例: 框架网页查询IP
      • Python: Flask中的GitHub OAuth
    • Django

      • chapter-01:Django框架认识

        • 1.1 Django的产生背景
        • 1.2 MTV设计模式
        • 1.3 Django 主要功能模块
      • chapter-02:开发环境配置

        • 2.1 Python的安装与配置
        • 2.2 虚拟环境安装与配置
        • 2.3 Django安装与配置
        • 2.4 MySQL安装配置
      • chapter-03:项目框架搭建

        • 3.1 Django管理工具-创建项目骨架
        • 3.2 修改项目的默认配置
        • 3.3 初始化项目环境
      • chapter-04:ORM应用与原理剖析

        • 4.1 构建POST应用需要的数据集
        • 4.2 Model相关的概念和使用方法
        • 4.3 Model的查询操作API
        • 4.4 ORM实现原理
      • chapter-05:Django管理后台

        • 5.1 将Model注册到管理后台
        • 5.2 管理后台实现原理
      • chapter-06:视图

        • 6.1 视图基础
        • 6.2 视图的高级特性和快捷方法
        • 6.3 基于类的通用视图
      • chapter-07:模板系统

        • 7.1 模板系统基础
        • 7.2 模板语言
      • chapter-08:表单系统

        • 8.2 使用表单系统实现表单: ModelForm
      • chapter-09:用户认证系统

        • 9.1 用户与身份认证
        • 9.2 权限管理
        • 9.3 用户认证系统应用
      • chapter-10:Django路由系统

        • 10.1 路由系统基础
      • chapter-11:Django中间件

        • 11.1 中间件基础
  • Python例子

    • Python: Linux的Shell命令
    • Python: PEP8自动格式化代码
    • Python: pip操作
    • Python: 业务服务监控
    • Python: 从文件逐行读取数据
    • 将链表转换为字符串
    • Python: 检查URL是否能正常访问
    • Python: 爬取网易云音乐
    • Python: 读取目录下的所有内容
    • 案例研究:文本统计
  • Python爬虫

    • 数据解析工具:Xpath
  • 算法题

    • 02:两数相加
    • 09:回文数
    • 13:罗马数值转换为整数
    • 14:最长公共前缀

2. Flask程序基本结构

  • 初始化
  • 路由和视图函数
    • 启动服务器
    • 完成的程序
    • 程序和请求上下文

初始化

所有的flask程序都必须创建一个程序实例。程序实例是Flask类的对象,经常使用下面代码创建:

from flask import Flask
app = Flask(__name__)

Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名称。大多数程序中。python的__name__变量就是所需要的值

将构造函数的 name 参数传给 Flask 程序,这一点可能会让 Flask 开发新手心生迷惑。Flask用这个参数决定程序的根目录,以便稍后够找到相对于程序根目录的资源文件位置 简单的程序,上面的代码足够了

路由和视图函数

客户端(web浏览器) --》 web服务器 --》 Flask程序实例。 这是一个流程,程序实例需要知道每个URL请求运行哪些代码,所以保存了一个URL到Python函数的映射关系。
处理URL和函数之间关系的程序就是路由.

定义路由:使用程序实例提供的app.route修饰器,把修饰的函数注册为理由。

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

修饰器是 Python语言的标准特性,可以使用不同的方式修改函数的行为。惯常用法是使用修饰器把函数注册为事件的处理程序。

前例把 index()函数注册为:程序根地址的处理程序。如果部署程序的服务器域名为www.example.com,在浏览器中访问http://www.example.com 后,会触发服务器执行 index()函数。这个函数的返回值称为响应,是客户端接收到的内容。如果客户端是Web浏览器,响应就是显示给用户查看的文档。
index() 这样的函数称为视图函数(view function)
视图函数返回的响应可以是包含HTML的简单字符串,也可以是复杂的表单.

Flask支持动态的URL,只需要在route修饰器中使用特殊的语法即可,定义动态route方法:

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

# 尖括号中的内容就是动态部分,任何能匹配静态部分的URL都会映射到这个路由上。
# user(name):就是视图函数
# Flask会将动态部分作为参数传入函数。
# 路由中的动态部分默认使用字符串,不过也可以使用类型定义

# 比如:
"""
路由:/user/<int:id>
只会匹配动态片段id为整数的URL。
Flask支持在路由中使用int,float和path类型
path类型也是:字符串,但不把斜线分隔符,而将其当做动态片段的一部分
"""

启动服务器

程序实例用run方法启动flask集成的web开发服务器

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

# __name__== '__main__'是Python的惯常用法,在这里确保直接执行这个脚本时才启动开发Web服务器。如果这个脚本由其他脚本引入,程序假定父级脚本会启动不同的服务器,因此不会执行 app.run()

服务器启动后,会进入轮询,等待并处理请求,直到程序停止。

有一些选项参数可被 app.run()函数接受用于设置web服务器的操作模式。
比如激活调试器和重载程序,要启用调试模式,我们需要将debug设置为True

Flask 提供的 Web 服务器不适合在生产环境中使用

完成的程序

示例:2-01:
hello.py 完整的Flask程序

from flask import FLask
app = Flask(__name__)

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

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

示例:2-02
hello.py

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)

程序和请求上下文

Flask从客户端收到请求,让视图函数能访问一些对象,这样才能处理请求。
请求对象,他封装了客户端发送的HTTP请求 要让视图函数能够访问请求对象,方法是:将其作为参数传入视图函数,不过将导致程序中的每个视图函数都增加一个参数。除了访问请求对象,如果试图函数在处理请求时还要访问其他对象,对程序而言,太过杂乱。

为避免大量可有可无的参数把视图函数弄乱,Flask使用上下文临时把某些对象变为全局可访问。有可上下文,既可以写出下面的视图函数:

from flask import request
@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    return '<p> You brwser is %s</p>' % user_agent
    

Flask中有两种上下文,程序上下文,请求上下文

变量名上下文说 明
current_app程序上下文当前激活程序的程序实例
g程序上下文处理请求时用作临时存储的对象,每次请求都会重设这个变量
request请求上下文请求对象,封装了客户端发出的HTTP请求中的内容
session请求上下文用户会话,用于存储请求之间“记住”的值的词典

请求调度

程序收到客户端发来的请求时,要找到处理该请求的视图函数。为了完成这个任务,Flask会在程序的URL映射中查找请求的URL。URL映射是URL和视图函数之间的对应关系。Flask使用app.route修饰器或者非修饰器形式的app.add_url_rule() 生成映射

响应

Flask调用视图函数,会将其返回值作为相应的内容。
响应就是一个简单的字符串,作为HTML页面回送到浏览器
HTTP响应中一个很重要的就是:状态码
Flask默认设为:200, 这个代码表明请求被成功处理

当需要视图函数返回的不同的状态码,可以把数字代码作为第二个返回值,添加到响应文本之后。

# 当需要视图函数返回一个400状态码,表示请求无效:
@app.route('/')
def index():
    return '<h1>Bad Request</h1>',400

视图函数返回的相应可接受第三个参数,是一个由首部(header)组成的字典,可以添加到HTTP响应中。

当不想返回由1个,2个或3个值组成的元组,Flask视图函数还可以返回Response对象。
make_response()可接受1个,2个或3个参数(和视图函数的返回值一样),并返回一个Response对象。 有时需要在视图函数中进行对象的转换,然后再相应对象上调用各种方法,进一步设置相应。
有一种名为重定向的特殊响应类型。这种响应没有相关页面文档,只会向告诉浏览器一个新地址用以加载新页面,重定向经常在web表单中使用。
重定向经常使用302状态码表示, 指向的地址有location首都提供。重定向响应可以使用3个值形式的返回值生成,可在Response对象中设定。

Flask提供了redirect()辅助函数,来生成这种响应:

from flask import redirect
@app.route('/')
def index():
    return redirect('http://www.baidu.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

abort 不会把控制权交还给调用它的函数,而是抛出异常把控制权交给 Web 服务器。

最近更新时间:
Prev
1. Flask简介
Next
3. Flask请求-响应循环