python现阶段三大主流Web框架: Django, Flask, Tornado对比.html
1. Django主要特色是大而全, 集成了不少组件, 例如: models, admin, form等, 无论你用获得用不到, 反正它全都有, 属于全能型框架.前端
Django一般用于大型Web应用因为内置组件足够强大因此使用Django开发能够一鼓作气.python
Django优势是大而全, 缺点也就暴露出来, 这么多的资源一次性所有加载, 确定会形成一部分的资源浪费.django
2. Flask主要特色是小而轻, 原生组件几乎为0, 三方提供的组件参考Django, 很是全面, 属于短小精悍型框架.json
Flask一般用于小型应用和快速构建应用, 其强大的三方库, 足以支撑一个大型的Web应用.flask
Flask优势是精悍简单后端
3. Tornado主要特色是原生异步非阻塞, 在IO密集型应用和多处理任务上占据绝对的优点, 属于专一性框架.安全
Tornado一般应用于API后端应用, 游戏服务后台, 其内部实现的异步非阻塞很稳定.服务器
Tornado优势是异步, 缺点是干净, 连session都不支持.session
函数初始化
全部Flask程序都必需要建立一个程序实例. Web服务器使用WSGI协议吧不接受自客户端的全部请求转交给这个对象处理. 程序实例是Flask类的对象, 常用如下方法建立 :
from flask import Flask app = Flask(__name__)
Flask类的构造函数只有一个必须指定的参数, 即程序主模块或者包的名字. 在大多数程序中, python的__name__变量就是所需的值.
Flask使用__name__参数决定程序的根目录, 以便之后能够方便的找到相对于程序根目录的资源文件的位置.
Response返回对象 :
HttpResponse : 直接返回字符串
Redirect : 重定向
render_template : HTML模板渲染, 返回html页面
○ 使用render_template返回渲染页面, 须要在项目中加入一个目录templates(源码默认设置), 而且右键templates目录 -> mark directory as 选择 Jinja2 模板语言.
send_file("文件路径") : 返回文件(图片, 音频, 视频)
jsonify("{id:1}") : 返回json格式的字符串(在响应头内加入了Content-Type:application/json)
Request请求 :
每一个框架中都有处理请求的机制(request), 可是每一个框架的处理方式和机制都是不一样的
在flask中导入request模块.
request.method # 请求方式 request.form # ImmutableMultiDict([])以看起来像字典的形式存储全部FormData的数据(支持字典的存取方法) request.form.to_dict() # 将ImmutableMultiDict数据格式转换为字典格式 request.args # 存储url上全部的参数数据 request.json # 若是在请求中写入了"application/json", 使用request.json则返回json解析数据, 不然返回None request.data # request是基于mimetype进行处理的, 若是content-type没法被解析时(即不属于mimetype类型), 存放没法处理的原始数据 request.url # 当前url的路径的所有路径 request.path # url的路由的地址 request.host # 主机地址 request.host_url # 将主机地址转换为httpurl request.files # 接收存放在FormData中文件类型的数据 ----------------------------------------------------------------------------------------- request.args和request.form区别 : request.args 是获取url中的参数 request.form 是获取form表单中的参数 而request.values是获取url + form内的全部参数(不建议使用, 当url和form中的参数名相同时, url的参数值会取代form参数值, 字典内不能有相同的key)
Jinja2模板语言 :
flask内的模板语言和django中用法基本相同, 不过flask在前端去数据时支持字典的取法
# 1. Jinja2模板语言中的for {% for i in j %} {% endfor %}
# 2. Jinja2模板语言的if {% if i %} {% elif j %} {% else %} {% endif %}
# 3. Jinja2模板语言的safe 当后端想给前端传递一个标签数据时, 前端直接显示会出现传递的代码数据, 而前端的解决办法是使用过滤方法" |safe ". 然后端的解决办法是 : 使用flask的Markup模块(markup(标签变量)), Markup帮助我们在HTML的标签上作了一层封装,让Jinja2模板语言知道这是一个安全的HTML标签 两种方法获得的结果相同.
# 4. Jinja2中执行python函数 想在Jinja2中执行函数, 能够在后端定义一个函数, 而且将函数名复制给一个变量传递给前端, 前端传入参数执行. 也可使用flask的全局函数, 不须要后端将函数复制变量传递给前端, 前端能够直接执行的函数. 定义全局函数须要后端使用@app.template_global()和@app.tempkate_filter()进行装饰 不过@app.tempkate_filter()的调用方法比较特别: {{ 参数1 | 定义的全局函数名(参数2, 参数3) }}
# 5. Jinja2的继承和include Jinja2的模板语言的继承include和和django内的使用方法类似 {% block xx %} # 在母版内定义继承块 {% endblock %} {% extends "母版名" %} # 在子模版内首行写继承语法 {% block xx %} {% endblock %} 当某一段代码重复使用几率很是高时, 能够将其单独写入一个页面, 使用include进行调用: {% include "复用代码名" %} # 调用语法