Flask开发笔记之一
来源:互联网 发布:windows线程同步事件 编辑:程序博客网 时间:2024/04/29 22:09
Flask开发笔记之一
1 关于Python Web框架
除了Flask,常见的PythonWeb框架还有:
l Django:全能型Web框架;
l web.py:一个小巧的Web框架;
l Bottle:和Flask类似的Web框架;
l Tornado:Facebook的开源异步Web框架。
Web 服务器使用一种名为 Web服务器网关接口的协议,把接收自客户端的所有请求都转交给这个对象处理 。
Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。Flask 用这个参数决定程序的根目录,以便找到相对于程序根目录的资源文件位置。在大多数程序中,Python 的 __name__ 变量就是所需的值。
1.1 路由和视图函数
先看个实例如下(安装完flask,即可运行如下python代码):
from flask importFlask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello World!</h1>'
if __name__ =='__main__':
app.run(debug=True)
__name__ =='__main__'是 Python 的惯用法,确保直接执行此脚本时才启动服务器。后面我们继续看路由、装饰器。
程序实例用run方法启动Flask继承的开发Web服务器。
服务器启动后,会进入轮询,等待并处理请求。轮询会一直进行,直到程序停止,比如按Ctrl-C键。debug=True表示启用调试模式,方便调试。
1.1.1 路由
客户端(例如web浏览器)把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例。程序实例需要知道对每个URL请求运行哪些代码,所以保存了一个URL到Python函数的映射关系。处理URL和函数之间的关系的程序称为路由。
程序实例保存了一个 URL 到 Python 函数的映射关系,处理URL 和函数之间关系的程序成为路由。
index()函数放在@app.route('/')后面,所以就是把index()函数注册为路由。
1.1.2 修饰器
Flask 中定义路由最简单的方式是使用程序提供的 app.route 修饰器,把修饰的函数注册为路由。修饰器是Python语言的标准特性,可以使用不同的方式修改函数的行为。惯常用法是使用修饰器把函数注册为事件的处理程序。
1.2 请求响应
Flask 使用上下文临时把某些对象变为全局可访问。
1.3 请求上下文
Flask 使用上下文让特定的变量在一个线程中全局可访问,与此同时还不会干扰其他线程。在 Flask 中有两种上下文:程序上下文和请求上下文,这两种上下文提供的变量。
变量名
上下文
说明
current_app
程序上下文
当前激活程序的程序实例
g
程序上下文
处理请求时用作临时存储的对象,每次请求都会重设这个变量
request
请求上下文
请求对象,封装了客户端发出的 HTTP 请求中的内容
session
请求上下文
用户绘画,用户存储请求之间需要“记住”的值的字典
1.4 请求钩子
有时在处理请求之前或者之后执行代码会很有用,Flask 提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用。请求钩子使用修饰器实现。Flask 支持以下四种钩子
钩子名
上下文
before_first_request
注册一个函数,在处理第一个请求之前运行
before_request
注册一个函数,在每次请求之前运行
after_request
注册一个函数,如果没有未处理的异常抛出,在每次请求后运行
teardown_request
注册一个函数,即使有未处理的异常抛出,也在每次请求后运行
可以使用set_cookie来设置Cookie ,如下代码
def index(): response = make_response('<h1>This document carries a cookie!</h1>') response.set_cookie('answer', '42') return response
2 实例
2.1 普通表单例子
from flask import Flaskfrom flask import requestapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def home(): return '<h1>Home</h1>'@app.route('/signin', methods=['GET'])def signin_form(): return '''<form action="/signin" method="post"> <p><input name="username"></p> <p><input name="password" type="password"></p> <p><button type="submit">Sign In</button></p> </form>'''@app.route('/signin', methods=['POST'])def signin(): # 需要从request对象读取表单内容: if request.form['username']=='admin' and request.form['password']=='password': return '<h3>Hello, admin!</h3>' return '<h3>Bad username or password.</h3>'if __name__ == '__main__': app.run()
3 参考
官方文档链接:http://docs.jinkan.org/docs/flask/
- Flask开发笔记之一
- 《flask web开发》笔记一
- 《Flask Web开发》重点笔记
- Flask笔记:(Flask开发基础与入门)
- Flask学习总结笔记(3)-- Jinja2模板引擎之一
- Threejs开发笔记之一
- Flask Web 开发学习笔记(一)
- flask笔记
- Flask笔记
- flask 笔记
- Flask笔记
- Flask之旅《Flask Web开发:基于Python的Web应用开发实战》学习笔记
- Symbian开发学习笔记之一
- 嵌入式开发学习笔记之一
- Symbian开发学习笔记之一
- Android开发系列笔记 之一
- kinect 2.0开发笔记之一
- 《Flask development》flask数据库笔记
- spring cloud+dotnet core搭建微服务架构:Api网关(三)
- centos服务器安装kvm虚拟机
- gRPC官方快速上手学习笔记(c#版)
- 整理文档,搜刮出一个vue2.0的contextmenu右键弹出菜单的实例代码
- js延迟加载
- Flask开发笔记之一
- webservice+axis2+spring+http/https
- 实时读取Properties配置文件的信息
- 用Redis构建分布式锁
- python利用f2py调用Fortran,并移植wrf-python
- Redis need tcl 8.5 or newer
- [2009哈尔滨]J
- 快速排序
- JSTL标签