官网:http://python.usyiyi.cn/translate/flask_011_ch/index.html
1. FLASK 概述
Flask是使用python语言编写的一个轻量级的web框架
内部WSGI实现采用Werkzeug,模板引擎使用Jinja2,使用BSD授权开源
在行业中,Flask也被称为microframework(微框架),因为Flask使用简单的核心操作,通过extension增加额外的功能,并且Flask没有默认的数据库和表单验证等支持
2. QUICK START
2.1. Installation
Flask的安装比较简单,和常规的模块安装方式一致,通过python提供的包安装工具pip或者easy_install都可以正常安装
pip install flask |
2.2. Hello World
安装完Flask之后,我们通过一个简单的应用程序来认识什么是Flask,Flask web项目的开发步骤以及核心组成部分
创建demo01.py,编辑如下内容
from flask import Flask app = Flask(__name__) @app.route(“/”) def hello(): return “Hello Flask!” |
if __name__ == “__main__”: app.run() |
可以看到,flask使用最简单的操作代码,就可以完成一个web项目需要的基本功能了
3.demo案例
3-1.简单的demo,了解falsk基本结构
''' 简单的flask应用 ''' # 引入需要的模块 from flask import Flask # Flask为核心处理模块,用来创建一个app应用 app=Flask(__name__) # 定义视图处理函数和对应的访问路由,该函数和路由已经被封装在app中。 @app.route('/') def index(): return '<h1>首页</h1>' @app.route('/login') def login(): return '<h1>登录</h1>' @app.route('/register') def register(): return '<h1>注册</h1>' if __name__=='__main__': app.run() """
总结:Django、Tornado和Flask三种框架定义视图处理函数(类)和路由的区别
Django中定义视图处理函数和路由:
视图处理函数:通过在views.py文件中,通过def关键字定义视图处理函数
路由:通过在urls.py文件中,urlpatterns=[]定义不同的路由和对应的视图处理函数
Tornado中定义视图处理类和路由: 视图处理类:通过class 关键字定义视图处理类,继承自tornado.web.RequestHandler 访问路由:通过tornado.web.Application配置路由信息,以元组的形式[(),],另外在此处可以配置其他信息 Flask中定义视图处理函数和访问路由 视图处理函数:通过def 关键字定义视图处理类 访问路由:直接在对应的视图处理函数上方,通过@app.route()定义对应的访问路由,可携带参数 """
3-2.flask传参
# 引入需要的模块 from flask import Flask # 使用Flask核心处理模块创建app应用 app = Flask(__name__) # 定义访问路由和对应的视图处理函数 @app.route('/login/<username>') # 将参数直接通过路由传递给后端 def login(username): # 括号中用来接收参数 return '接收到参数%s' % username @app.route('/index/<int:user_id>') # 传递指定类型的参数 def index(user_id): return '接收到指定的int类型的参数:[%s]' % user_id if __name__ == '__main__': app.run() """
总结:
Django中定义路由传递参数: url('^index/(?P<u_id>\d+)/') 在Django2中path('index/<int:u_id>/) Tornado中定义路由传递参数: Flask中定义路由传递参数 @app.route('/index/<int:user_id>') """
3-3.get和post请求方式传递参数和接收参数,借助于postman插件
postman:专门用于8种请求方式的测试的插件。
''' get方式和post方式接收参数的方法不同,这里使用了postman(专门测试8中请求方式的插件),进行两种方式的测试 ''' # 引入需要的模块 from flask import Flask,request # 使用Flask核心处理模块创建一个app应用 app=Flask(__name__) # 定义访问路由和视图处理类 @app.route('/get') def get_params(): # request的args属性是专门用来接收get参数的 params=request.args.get('get_params') return '接收到get参数:【%s】'%params @app.route('/post',methods=['POST'])# 默认所有的视图处理函数只支持get请求,若需要支持其他请求方式,需使用methods属性,以列表的形式列出def post_params(): # request的form属性是专门用来接收post参数的 params=request.form.get('post_params') return '接收到post参数:【%s】'%paramsif __name__=='__main__': app.run()"""
不同请求参数的接收>>> Django中: request.GET/POST Tornado中: self.get_query_argument()/get_query_arguments() self.get_body_argument()/get_body_arguments() self.get_arguement()/get_arguments() Flask中: request.args.get("key") request.form.get("key") 不同请求方式的区分>>> Django中: 通过request.method == "GET" / "POST"进行视图函数中不同请求方式的处理区分 同样可以通过装饰器注解方式:@require_POST @require_GET方式指定视图函数只能接收那种请求方式 Tornado中: 可以通过直接重写父类RequestHandler中的get/post/..的请求处理方法来实现不同的请求方式的区分 Flask中: 通过路由装饰器注解的methods属性来指定视图处理函数可以接收那种请求方式 @app.route("/", methods=["get", "post"..])
"""
3-4.网页模板和静态资源
.py文件
# 引入需要的模块 from flask import Flask, request, render_template # 创建app应用 app = Flask(__name__) @app.route('/index') def index(): plist = [{'name': 'jerry'}, {'name': 'tom'}, {'name': 'suker'}]# render_template会自动搜索同级目录下的templates文件夹找到对应的html文件 return render_template('index.html', plist=plist) if __name__ == '__main__': app.run()""" 静态文件和网页模板的处理: Django中: 子模块应用:templates/默认保存网页模板;static/默认保存静态资源;不需要配置 根项目:settings.py中通过TEMPLATES>DIRS配置网页模板文件夹,通过STATICFILES_DIRS配置静态资源文件夹 Tornado中: 通过tornado.web.Application中的配置选项 template_path配置网页模板文件夹位置,static_path配置静态资源文件夹位置 Flask中: 默认templates/中保存网页模板;static/中保存静态资源,不需要配置 模板语法操作: Django中: 默认使用自己的模板语法:Django Template Language:DTL语法 Tornado中: 默认使用jinja模板语法:~经过一定改造的模板语法 Flask中: 默认使用第三方的jinja2模板语法,是在DTL语法的基础上完善的一种专门给python使用的模板语法 """
在该文件同级目录下创建templates文件夹和static文件,用来保存网页模板和静态资源index.html文件<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户首页</title> <link href="/static/index.css" rel="stylesheet"> </head> <body> <h1>用户首页</h1> {% for p in plist %} # 注意这里的模板语法,django中{% empty %}在这里替换为{% else %}} <p>{{p['name']}}</p> {% else %} <p>还没有任何用户</p> {% endfor %} </body> </html>
文档总结:
1.1. API INTRODUCTION
l flask.Flask
核心模块之一,Flask可以构建封装完成的WSGI应用
l flask.Flask.route(path)
核心模块之一,Flask应用中的路由配置,主要加载在视图操作函数上,完成path路径和视图函数之间的路由映射关系
l flask.Flask.run()
核心模块之一的函数,通过run()函数将web应用部署到web服务器并启动服务
1.2. 项目访问
通过run()函数直接操作启动服务器,只能在本机访问,如果要让所有主机所在的网络地址都可以访问当前web项目,添加host参数配置即可
app.run(host=“0.0.0.0”) |
1.3. 调试模式
默认情况下Flask没有启用调试模式,可以在开发过程中,通过debug配置完成调试模式的启用,调试模式下视图页面和控制台将会展示更多的更加详细的错误信息
app.debug = True app.run(host=“0.0.0.0”) |
注意:Flask项目中,调试模式的启用,会允许客户端执行任意python代码,是一个非常大的安全隐患,通常情况下只是在开发过程中使用;在生产环境用严禁使用调试。 |
1.4. 路由操作
Flask项目中,路由通过@app.route(path)注解的方式进行添加,将访问地址和视图处理函数直接进行关联
from flask import Flask app = Flask(__name__) @app.route(“/”) def index(): pass @app.route(“/login”) def login(): pass |
1.5. RESTful参数操作
路由将对应URL请求路径和视图处理函数进行了关联,我们可以通过URL地址进行参数的传递,也就是RESTful风格的参数操作
在Flask中,在路由路径中通过<变量名称>的方式定义URL路径可以接受参数,也可以在参数定义时,定义参数变量的数据类型<类型:变量名称>
在视图处理函数的参数列表中,通过该变量名称可以直接使用接收到的参数
from flask import Flask app = Flask(__name__) @app.route(“/user/<username>“) def check_username(username): return “hello %s” % username @app.route(“/userinfo/<int:user_id>“) def check_userinfo(user_id): return “hello %s” % user_id |
1.6. GET/POST请求操作
在@app.route(path)常规路由定义时,参数的传递方式可以通过RESTful方式进行提交,如果是传统的GET/POST提交参数数据时,可以通过Flask指定的方式进行参数数据的获取
from flask import Flask, request app = Flask(__name__) @app.route(“/get”, methods=[“GET”]) def get_param(): print(request.args.get(“param_name”)) return “hello get method!” @app.route(“/post”, methods=[“POST”]) def post_param(): print(request.form.get(“name”)) return “hello post method!” |
1.7. 视图模板
Flask中通过flask.render_template(..)渲染指定的网页模板给浏览器查看,同时可以附带对应的参数在网页模板中进行展示
模板的定义不需要配置任何选项,自动在templates/目录中查询对应的模板页面
并且在网页模板中,可以正常使用Jinja2模板语法进行数据的渲染展示操作
from flask import Flask, render_template app = Flask(__name__) @app.route(“/”) def index(): users = [ {“name”:”admin”, “age”:12}, {“name”:”manager”, “age”:23}, {“name”:”administrator”, “age”:11}, ] return render_template(“index.html”, users=users) |
templates/index.html视图网页中通过模板语法渲染数据
<ul> {% for u in users%} <li>{{u.name}}--{{u.age}}</li> {% endfor %} </ul> |
注意:视图处理函数中,返回渲染数据,可以直接返回渲染的网页,同样可以返回下一个请求的路由 render_template(..):渲染返回指定的网页模板数据 redirect(..):渲染返回下一个继续请求的路由 |
1.8. 静态文件
Flask中的静态文件,存放在项目的static/文件夹中,可以直接定义各种静态文件并在项目网页模板中通过/static/..的路径进行操作
项目根目录下创建static/文件夹,文件夹中创建对应的静态文件index.css
/home_dir/static/index.css
*{margin:0px;padding:0px;font-size:16px;} p{color:orange;} |
在页面模板中,可以通过路径引入对应的静态文件
/home_dir/templates/index.html
<!doctype html> <html> .. <link rel=“stylesheet” href=“/static/index.css”> .. </html> |