Flask学习笔记02--Flask基本结构
来源:互联网 发布:网络培训平台 编辑:程序博客网 时间:2024/05/29 08:00
1. 初始化
所有的flask程序都必须创建一个程序实例,程序实例是Flask类的对象,使用下面的代码创建:
from flask import Flaskapp = Flask(__name__)
Flask类的构造函数必须指定一个参数,即程序主模块或包的名字,在大多数程序中,Python的name变量就是所需的值,Flask用这个参数决定程序的根目录,以便能够找到相对于程序根目录的资源文件的位置。
2. 路由和视图函数
客户端将请求发送到web服务器,web服务器再将请求发送到Flask的程序实例,但是程序实例需要知道对每个URL请求运行哪些代码,所以保存URL到python函数的对应关系。
路由即是处理URL和函数之间关系的程序,Flask中使用路由最简便的方式就是使用程序实例提供的app.route
修饰器,把修饰器的函数注册为路由,下面为根目录的实例:
@app.route('/')def index():return "<h1>hello,Flask</h1>"
像index()这样的函数称之为视图函数。视图函数返回的响应可以使包含HTML的简单字符串,也可以是复杂的表单,等等,不过一般来说不会再python代码中嵌入响应字符串,生成响应的正确方法是使用模板。
很多地址中间都包含可变的部分,例如www.baidu.comnews,www.baidu.com/picture等等,Flask支持这种类型的URL,只需要在修饰器中使用特殊的句法。例如:
@app.route('/user/<name>')def user(name): return '<h1>hello, %s</h1>' % name
尖括号中的内容就是动态部分,任何能够匹配静态部分的URL都会映射到这个路由上,调用视图函数时,Flask会将动态部分作为参数传入函数。
路由中的动态部分默认为字符串,不过也可以使用类型定义,例如/user/<int:id>
,只会匹配动态片段id为整数的URL。Flask支持在路由中使用int
,float
和path
类型。path类型就是字符串,但是不会将斜线作为分隔符,而是当做动态片段的一部分,例如:/user/<path:sss>
能够匹配/user/news/person/getAll
3. 启动服务器
程序实例使用run方法启动Flask集成的开发Web服务器:
if __name = '__main__': app.run(debug=True)
__name__ = '__main__'
是python的一种用法,保证直接执行脚本时启动开发服务器,如果这个脚本由其他脚本引入,程序假定父级脚本会启动不同的服务器,因此不会执行app.run()。
在开发过程中启用debug=True
启动调试模式,方便调试。
4. 完整的程序实例
先创建一个文件夹,在内部创建一个test.py,写入以下代码:
from flask import Flaskapp = Flask(__name__)@app.route('/')def index(): return '<h1>Hello World!</h1>'if __main__ = '__main__': app.run(debug=True)
在命令行中使用 python test.py
运行这个程序,并在浏览器中输入http://127.0.0.1:5000/
,可以看到页面中出现Hello World!。
下面是上面程序的扩展,可以从URL中获取动态内容并显示在页面中:
from flask import Flaskapp = Flask(__name__)@app.route('/')def index(): return '<h1>Hello World!</h1>'@app.route('/user/<name>')def user(name): return '<h1>Hello, %s!</h1>' % nameif __main__ = '__main__': app.run(debug=True)
然后在浏览器中输入http://127.0.0.1:5000/user/aaa
可以看到页面中出现Hello,aaa!。
5. 请求-响应循环
5.1 程序和请求上下文
Flask从客户端接受请求后,要让视图函数能够访问一些对象,这样才能处理请求。请求对象就是一个很好的例子,它封装了客户端发送的HTTP请求。
要让视图函数能够访问请求对象,可以将其作为参数传入视图函数,但是这会导致程序中每个视图函数都会增加一个参数。除了访问请求对象,如果视图函数在处理请求的同时还要访问其他对象,情况会变得糟糕。
为了避免大量可有可无的参数,Flask使用上下文临时把某些对象变为全局可访问,有了上下文,就可以写出下面的视图函数:
from flask import request@app.route('/')def index(): user_agent = request.headers.get('User-Agent') return '<p>你的浏览器是 %s</p>' % user_agent
中文报错请在文件最前面加上
# -*- coding:utf-8 -*-
在这个视图函数中我们把request当做全局变量来使用,但是request不是全局变量。
试想,在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,每个线程看到的 request 对象必然不同。Falsk 使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。
在 Flask 中有两种上下文:程序上下文和请求上下文。
current_app 程序上下文 当前激活程序的程序实例g 程序上下文 处理请求时用作临时存储的对象。每次请求都会重设这个变量request 请求上下文 请求对象,封装了客户端发出的 HTTP 请求中的内容session 请求上下文 用户会话,用于存储请求之间需要“记住”的值的词典
5.2 响应
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 对象。下例创建了一个响应对象,然后设置了 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
有一种名为重定向的特殊响应类型,重定向经常使用 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
**注意, abort 不会把控制权交还给调用它的函数,而是抛出异常把控制权交给 Web 服
务器。**
- Flask学习笔记02--Flask基本结构
- flask学习笔记(-结构)
- flask学习笔记1【服务器程序基本结构】
- Flask基本结构
- Flask基本结构(一)
- Flask 多文件基本结构
- Flask:程序的基本结构
- Flask程序的基本结构
- Flask学习笔记 安装Flask(Windows xp)
- Flask学习笔记01--安装Flask
- Flask-SQLALchemy学习笔记
- Flask学习笔记-1
- Flask源码学习笔记
- flask学习笔记
- flask学习笔记(-模板)
- flask学习笔记(-数据库)
- flask学习笔记
- Flask--学习笔记-注册
- 黑马程序员——关于集合的例题
- 黑马程序员_JAVA之IO流的(转换流,数据输入输出流等)
- 安卓高级计算器完整版
- Awk学习笔记(一)
- sql主键和外键的区别
- Flask学习笔记02--Flask基本结构
- 软件功能测试UFT篇
- 如果用Servlet做文件下载的话,当用户中途取消了下载那么Servlet是会继续向用户传送没有传送完的文件还是Servlet会自动关闭当前线程?
- iOS 苹果官方Demo合集
- 【离散数学】【改进版】实验二 集合上二元关系性质判定的实现
- mysql_real_escape_string()--mysql数据库
- CentOS + Tomcat 请配置 JRE_HOME 环境变量
- IOS(Simulator)模拟器切换横竖屏的快捷键
- c++ primer第五版(中文)习题答案 第十章第四节第二小节-iostream迭代器