- 一个最小的应用
- 调试模式
- 路由
- 静态文件
- 模板渲染:
- 除了/static, /templates 目录;
- 在模版里面,可以访问request, session 和 g对象,以及get_flashed_messages.
- 模版继承
- 访问请求数据 request
- 单元测试的最简单的解决方案是:用test_request_context()环境管理器。
- 结合with声明,绑定一个测试请求,这样才可以与之交互。
- 请求对象
- 当前请求的HTTP方法可以通过flask.request.method获得
- 通过flask.request.form属性来访问表单数据(POST或PUT请求提交的数据)。
- 通过request.args属性访问URL中提交的参数(?key=value)
- 具体看request文档
- 文件上传
- 在HTML 表单中设置 enctype="multipart/form-data" 属性
- 已上传的文件存储在内存或是文件系统中一个临时的位置。可以通过request.files属性访问她们。
- 每个上传的文件都会存储在这个字典里。
- 它表现近乎为一个标准的Python file对象,但它还有一个save()方法,这个方法允许你把文件保存到服务器的文件系统上。
- request.filename了解上传前在客户端的文件名—不要信任它,它可以伪造
- 信任的文件名secure_filename()
- Cookies
- 通过request.cookies属性访问Cookies
- 用响应对象response的set_cookie方法来设置Cookies.
- 请求对象的cookies属性是一个内容为客户端提交的所有Cookies的字典。
- 如果想要使用会话,不要直接使用Cookies。
- 在Flask中,已经注意处理了一些Cookies安全细节。
- Cookies是设置在响应对象上的。
- 由于通常视图函数只是返回字符串,之后Flask将字符串转换为响应对象。
- 如果要显式地转换,可以使用make_response()函数然后再进行修改。
- 重定向和错误
- redirect()
- abort()
- 定制错误页面,使用@app.errorhandler(404)装饰器
- 关于响应 response
- 视图函数的返回值会被自动转换为一个响应对象。
- 如果返回值是一个字符串,它被转换该字符串为主体的、状态码为200 OK的、MIME类型是’text/html’的响应对象。
- Flask把返回值转换为响应对象的逻辑是这样:
- 如果返回的是一个合法的响应对象,它会从视图直接返回。
- 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
- 如果返回的是一个元组,且元组中的元素可以提供额外的信息。这样的元组必须是(response,status,headers)的形式,且至少包含一个元素。status值会覆盖状态代码,headers可以是一个列表或字典,作为额外的消息标头值。
- 如果上述条件均不满足,Flask会假设返回值是一个合法的WSGI应用程序,并转换为一个请求对象。
- 如果你想在视图里操作上述步骤结果的响应对象,可以使用make_response()函数。
- 会话 session
- 除请求对象之外,还有一个session对象。
- 它允许你在不同请求间存储特定用户的信息。
- 它是在Cookies的基础上实现的,并且对Cookies进行密钥签名。
- 这意味着用户可以查看你Cookie的内容,但却不能修改它,除非用户知道签名的密钥。
- 生成强壮的密钥:import os , os.urandom(24)
- 消息闪现
- 反馈,是良好的应用和用户界面的重要构成
- 如果用户得不到足够的返回,他们很可能开始厌恶这个应用。
- Flask提供了消息闪现系统,可以简单地用用户反馈。
- 消息闪现系统通常会在请求结束时记录信息,并在下一个(且仅在下一个)请求中访问记录的信息。
- 展现这些消息通常要结合模版布局。
- 使用flash()方法可以闪现一条消息。
- 要操作消息本身,请使用get_flashed_messages()函数,并且在模版中可以使用
- 日志记录
- 从Flask 0.3开始,Flask就已经预置了日志系统。
- 附带的logger时一个标准日志类
- app.logger.debug(‘A value for debugging’)
- app.logger.warning(‘A warning occurred (%d apples)’,42)
- app.logger.error(‘An error occurred’)
- 整合WSGI中间件
- 如果你想要给你的应用添加WSGI中间件,你可以封装内部WSGI应用。
- 例如若是你想用Werkzeug包中的某个中间件来应付lightpd中的bugs
- 部署到Web服务器
- 部署到托管平台
- and so on …