博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[贰]Flask web开发:程序的基本结构
阅读量:6306 次
发布时间:2019-06-22

本文共 3296 字,大约阅读时间需要 10 分钟。

本系列笔记是我阅读Miguel Grinberg的《Flask Web Development》的笔记,标题与书本同步。希望通过记录技术笔记的方式促进自己对知识的理解。

本篇对应书本第二章:程序的基本结构。

初始化

from flask import Flask #导入Flask模块app = Flask(__name__) #创建Flask类的实例

注:对于Flask开发者来说,传给Flask应用程序构造函数的name参数是比较容易弄混淆的。Flask使用这个参数来确定应用程序的根目录,这样以后可以相对这个路径来找到资源文件。

路由和视图函数

注册新的路由

在Flask应用中,路由是指用户请求的URL与视图函数之间的映射。

Flask框架 根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数, 并将视图函数的执行结果返回WSGI服务器。

匹配动态URL

route装饰器 :可以使用Flask应用实例的route装饰器将一个URL规则绑定到一个视图函数上。

下面程序中route装饰器将根目录绑定在index视图上。

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

Hello World!

'

URL变量类型过滤

@app.route('/user/
')def user(name): return '

Hello, %s

' % name类似:int 接受整数(float接受浮点数)@app.route('/post/
')path转换器允许规则匹配包含/的字符串。@app.route('/file/
')

启动服务器

if __name__ == '__main__':    app.run(debug=True)    # 模块是对象,并且所有的模块都有一个内置属性 __name__。# 一个模块的 __name__ 的值取决于您如何应用模块。# 如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。# 但是您也可以像一个标准的程序样直接运行模块,# 在这种情况下, __name__ 的值将是一个特别缺省"__main__"。# debug=True 调试模式开启

一个完整的程序

hello.py: 一个完整的Flask程序

from flask import Flaskapp = Flask(__name__)@app.route('/')def index():    return '

Hello World!

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

运行结果如下:

hello.py: 包含动态路由的Flask程序

from flask import Flaskapp = Flask(__name__)@app.route('/')def index():    return '

Hello World!

' @app.route('/user/
')def user(name): return '

Hello,%s

' % name if __name__ == '__main__' app.run(debug=True) # 定义了动态路由/user/

运行结果如下:

请求-响应循环

程序和请求上下文

请求对象封装了客户端发送的HTTP请求。

将请求对象作为参数传入视图函数,视图函数即可访问请求对象。

from flask import request@app.route('/')def index():    user_agent = request.headers.get('User-Agent')    return '

Your browser is %s

' % user_agent

Flask上下文全局变量

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

程序上下文使用方法:

>>> from hello import app>>> from flask import current_app>>> current_app.nameTraceback(most recent call last):...RuntimeError:working outside of application context>>> app_ctx = app.app_context()>>> app_ctx.push()>>> current_app.name'hello'>>> app_ctx.pop()# app.app_context()可获得一个程序上下文

请求调度

URL映射中的HEAD、Options、GET是请求方法,由路由进行处理。

不同的请求方法发送到相同的URL上时,会使用不同的视图函数进行处理。

请求钩子

Flask支持以下4种钩子:

  • before_first_request:注册一个函数,在处理第一个请求之前运行。

  • before_request:注册一个函数,在每次请求之前运行。

  • after_request:注册一个函数,如果没有未处理的异常抛出,也在每次请求之后运行。

  • teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。

响应

创建响应对象并设置Cookie

from flask import make_response

@app.route('/'):def index():    response = make_response(

This document carries a cookie.

) response.set_cookie('answer','42') return response

重定向

from flask import redirect@app.route('/')def index():    return redirect('http://www.example.com')

错误处理

from flask import abort@app.route('/user/
')def get_user(id): user = load_user(id) if not user: abort(404) return '

Hello, %s

' % user.name

Flask扩展

Flask被设计为可扩展模式,一些重要功能是用安装包的形式增加。

使用Flask-Script支持命令行选项

(venv)$pip install flask-scripthello.py:使用Flask-Scriptfrom flask_script import Managermanager = Manager(app)# ...if __name__ == '__main__':    manager.run()

运行Python程序: python hello.py runserver

web服务器可使用 网络中的任一台电脑进行访问,其中'a.b.c.d'是服务器所在计算机的外网的IP地址。
Python hello.py runserver --host 0.0.0.0


本文由  创作,采用  进行许可。

转载地址:http://dqixa.baihongyu.com/

你可能感兴趣的文章
关于 Flume NG
查看>>
北电交换机常用配置
查看>>
Linux磁盘及文件系统管理
查看>>
Linux系统下Apache日志文件设置、更改默认网站目录、防止php***跨站设置、禁止空主机头...
查看>>
shell判断文件是否存在
查看>>
EXCHANGE事务日志和邮箱数据库的存储位置
查看>>
oracle conn /as sysdba后显示 乱码”???“
查看>>
(三)把域服务升级和迁移到Windows Server 2012 R2上
查看>>
动态主机配置协议:DHCP简介
查看>>
跟我学Spring Cloud(Finchley版)-05-服务注册与服务发现-Eureka入门
查看>>
VisualStudio不让控制台程序一闪而过
查看>>
交换机配置
查看>>
python读取excel表格的数据
查看>>
折半查找
查看>>
写给创始人的期权问答及实操白皮书(连载一)
查看>>
jenkins集成sonarqube
查看>>
snort 中的Boyer-Moore
查看>>
ip_append_data
查看>>
百度云
查看>>
py Image模块的介绍
查看>>