Flask之request,response,Jinja2

python现阶段三大主流Web框架: Django, Flask, Tornado对比.

1. Django主要特点是大而全, 集成了很多组件, 例如: models, admin, form等, 不管你用得到用不到, 反正它全都有, 属于全能型框架.

  Django通常用于大型Web应用由于内置组件足够强大所以使用Django开发可以一气呵成.

  Django优点是大而全, 缺点也就暴露出来, 这么多的资源一次性全部加载, 肯定会造成一部分的资源浪费.

2. Flask主要特点是小而轻, 原生组件几乎为0, 三方提供的组件参考Django, 非常全面, 属于短小精悍型框架.

  Flask通常用于小型应用和快速构建应用, 其强大的三方库, 足以支撑一个大型的Web应用.

  Flask优点是精悍简单

3. Tornado主要特点是原生异步非阻塞, 在IO密集型应用和多处理任务上占据绝对的优势, 属于专注性框架.

  Tornado通常应用于API后端应用, 游戏服务后台, 其内部实现的异步非阻塞很稳定.

  Tornado优点是异步, 缺点是干净, 连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 "复用代码名" %} # 调用语法
原文地址:https://www.cnblogs.com/dong-/p/10124271.html