目录
一、Flask是什么?
二、Flask常用扩展包
三、第一个Flask程序
四、路由
五、response对象
一、Flask是什么?
Flask是Python语言基于Werkzeug工具箱编写的轻量级Web开发框架,其几乎所有功能都要用到扩展,其WSGI工具箱采用Werkzeug(路由模块),模板引擎使用Jinja2,是一种更为灵活的开发框架
二、Flask常用扩展包
1.操作数据库:Flask-SQLalchemy
2.管理迁移数据库:Flask-migrate
3.邮件:Flask-Mail
4.表单:Flask-WTF
5.提供国际化和本地化支持,翻译:Flask-Bable
6.插入脚本:Flask-script
7.认证用户状态:Flask-Login
8.认证:Flask-OpenID
9.开发REST API的工具:Flask-RESTful
10.集成前端Twitter Bootstrap框架:Flask-Bootstrap
11.本地化日期和时间:Flask-Moment
12.简单可扩展的管理接口的框架:Flask-Admin
中文文档介绍Flask:
http://docs.jinkan.org/docs/flask/
三、第一个Flask程序
#导入Flask扩展
from flask import Flask
#创建flask应用程序实例
app=Flask(__name__)
#定义路由以及视图函数
#flask中定义路由是通过装饰器实现
@app.route('/')
def index():
return 'Hello,flask!Hello,flask!'
#启动程序
if __name__ == '__main__':
#执行了app.run,就会将flask程序运行在一个简易的服务器(Flask提供,用于测试)
#host给出允许外网访问
app.run()
debug模式:布尔类型,默认为False
1>debug=True:当代码改变时,服务器会重新加载最新代码,此模式适用于开发环境development
2>debug=False:只会加载出第一遍的代码,代码改变不会自动加载?,适用于生产环境production
config:修改配置
app.config['ENV']='development'
app.config['DEBUG']='True'
可以将默认的production环境修改为development环境
app.config.fome_object(settings):可以将setting中写好代码直接导入
Flask程序运行过程:
1.当客户端想要获取资源时,一般会通过浏览器发起HTTP请求 2.此时,Web服务器会把来自客户端的所有请求都交给Flask程序实例 3.程序实例使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)? 4.根据每个URL请求,找到具体的视图函数并进行调用,在Flask程序中,路由的实现一般是通过程序实例的装饰器实现 5.?Flask调用视图函数后,可以返回两种内容: 1>字符串内容:将视图函数的返回值作为响应的内容,返回给客户端(浏览器) 2>HTML模版内容:获取到数据后,把数据传入HTML模板文件中,模板引擎负责渲染HTTP响应数据,?然后返回响应数据给客户端(浏览器)
四、路由
1.常见的HTTP状态码:
1.200-请求成功
2.301-资源(网页等)被永久转移到其它(URL)
3.404-请求的资源(网页等)不存在
4.500-内部服务器错误(代码问题)
HTTP状态码分类:HTTP状态码由三个十进制数字组成,第一个数字为状态码类型,后俩个无分类作用
分类 | 分类描述 | 1** | 信息,服务器收到请求,需要请求者继续执行操作 | 2** | 成功,操作被成功接收并处理 | 3** | 重定向,需要进一步操作以完成请求 | 4** | 客户端错误,请求包含语法错误或无法完成请求 | 5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
2.路由:是指分组从源到目的地时,决定端到端路径的网络范围的进程,现代web应用都使用有意义的URL,通常使用route()装饰器将函数绑定到URL
@app.route('/index')
def index():
return 'Hello,flask!'
等效于
def index():
return 'Hello,flask!'
app.add_url_rule('/index,view_func=index')
请求方式限定:L路由默认只支持GET,如果需要增加需要使用methods参数指定可接收的请求方式
@app.route('/',methods=['GET','POST'])
3.路由的变量规则:通过将URL一部分标记为<variable_name>就可以在URL中添加变量,通过使用<converter:variable_name>可以选择性添加一个转换器,为变量指定规则(变量默认为string类型)
转换器类型 | 说明 | string | 接收任何不包含斜杠的文本 | int | 接收正整数 | float | 接收正浮点数 | path | 类似string但可以包含斜杠 | uuid | 接收UUID字符串 |
例:加法运算
from flask import Flask
app=Flask(__name__)
@app.route('/add/<int:num>')
def get_order_id(num):
print (type(num))
result=num+1
return str(result)#结果返回只能是字符串/字典/元组/Response instance/WSGI callable
if __name__=='__main__':
app.run()
注意:
1>路由中若添加了'/'即@app.route('/progects/),无论请求的URL是否带有‘/’都可以执行视图函数如果请求的是没有‘/’浏览器做了一次重定向
2>若路由中未添加‘/’,@app.route('/progects)但是请求的URL中添加即http://127.0.0.1:5000/progect/,那么显示Not Found
五、Response对象
1.return 后面直接返回字符串实际也是做了一个response对象的封装,最终返回结果还是response对象
from flask import Flask,Response
app=Flask(__name__)
app.config['ENV']='development'
app.config['DEBUG']='True'
@app.route('/index1')
def index1():
return Response('今天星期几?')
if __name__=='__main__':
app.run()
2.通过make_response,自定义响应头、响应体和状态码来自定义response对象
from flask import Flask, Response, make_response
app=Flask(__name__)
app.config['ENV']='development'
app.config['DEBUG']='True'
@app.route('/index2')
def index2():
content='''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是一个模板<br>
这是一个首页<br>
</body>
</html>
'''
response = make_response(content)
response.headers['mytest']='abcd'
return response
if __name__ == '__main__':
app.run()
|