1.Python 现阶段三大主流Web框架 Django Tornado Flask 对比

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

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

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

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

  • Tornado 通常用于API后端应用,游戏服务后台,其内部实现的异步非阻塞真是稳得一批
  • Tornado 优点是异步,缺点是干净,连个Session都不支持

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

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

2.Flask的安装

pip install Flask

3.Flask的第一个简单应用

实现一个简单的web程序:

from flask import Flask  #导入Flask类

# __name__指定当前文件名flask1.py
app = Flask(__name__) #实例化一个Flask对象 # 指定路由,app中的route装饰器
@app.route("/")
def home(): #视图函数
return "hello world!" #相当于HttpResponse返回数据 if __name__ == '__main__':
# 定义访问ip与port
app.run("0.0.0.0", 5050)

web页面展示:

  

4.Flask中的render_template

Flask中render_template相当于Django中render函数,返回一个模板,但Flask不需要指定request参数

from flask import Flask, render_template  #导入Flask类

# __name__指定当前文件名 flask1
app = Flask(__name__) #实例化一个Flask对象 # 指定路由,app中的route装饰器
@app.route("/home")
def home():
return render_template("home.html") if __name__ == '__main__':
# 定义访问ip与port
app.run("0.0.0.0", 5050)

home.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <h1>success!</h1> </body>
</html>

注意: 如果要使用 render_template 返回渲染的模板,请在项目的主目录中加入一个目录 templates

  

5.Flask中的redirect重定向

Flask中redirect重定向同Django中的redirect函数,具体方法如下:

from flask import Flask,redirect #导入Flask类

# __name__指定当前文件名flask1.py
app = Flask(__name__) #实例化一个Flask对象 # 指定路由,app中的route装饰器 endpoint 给路由分配别名 如果不写默认是当前函数名(不可重复)
@app.route("/reback",endpoint="reback")
def reback():
# 重定向指定路经前需要加“/”
return redirect("/index") if __name__ == '__main__':
# 定义访问ip与port
app.run("0.0.0.0", 5050)

6.Flask中的formdata表单提交

每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的

首先要从 flask 包中导入 request 模块,Flask中request模块是一个全局变量

methods=["POST", "GET"] 代表这个url地址允许 POST与GET 请求两种方式,是个列表也就是意味着可以允许多重请求方式,这里表单提交需要通过GET显示HTML页面,再通过POST提交数据

from flask import Flask, render_template, request
import os app = Flask(__name__)
app.debug = True @app.route("/login", methods=["POST", "GET"])
def login():
if request.method == "GET":
# 获取URL中的参数,例如传入参数:http://127.0.0.1:5000/login?id=1
print(request.args.get("id"))
# 获取URL中的参数 转换成 字典
print(request.args.to_dict())
# 获取请求原始信息
print(request.environ)
# 路由地址 /login
print(request.path)
# 获取访问路径
print(request.url) # http://127.0.0.1:5000/login?id=1
# 获取URL头,不包含参数 /login
print(request.base_url) # http://127.0.0.1:5000/login return render_template("login.html") if request.method == "POST":
# 请求头中的数据
print(request.headers) print(request.json) # 请求头中 Content-type:application/json 数据序列化 request.json
print(request.data) # 请求头中 Content-type 不包含 Form or data # Formdata 和 Args查询参数 中的数据
print(request.values) username = request.form.get("user")
password = request.form.get("pwd")
print(username, password) return "200 OK" if __name__ == '__main__':
app.run()

  HTML的form表单:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <form action="" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="user">
密码:<input type="password" name="pwd">
<input type="submit" value="提交">
</form> <script></script>
</body>
</html>

Form表单中传递过来的值 使用 request.form 中拿到:

注意:这里把ImmutableMultiDict 字典转换成普通字典需要to_dict方法,否则会报错

print(request.form)  # ImmutableMultiDict([('user', '123'), ('pwd', '456')])
# ImmutableMultiDict 它是一个特殊字典
print(request.form["user"]) # 123
print(request.form.get("pwd")) # 456 print(list(request.form.keys())) # ['user', 'pwd']
#这里可以把上面的特殊字典转化成普通字典形式,注意这里Flask中字典转换方法是to_dict
req_dict = request.form.to_dict()
print(req_dict) # {'user': '123', 'pwd': '456'}

这是让我们在使用form表单提交的同时使用url参数提交:

print(request.values)  # CombinedMultiDict([ImmutableMultiDict([('id', '1'), ('age', '20')]), ImmutableMultiDict([('user', '123'), ('pwd', '456')])])
print(request.values.get("id")) # 1
print(request.values["user"]) # 123
# 这回喜欢直接操作字典的小伙伴们有惊喜了! to_dict() 方法可以直接将我们的参数全部转为字典形式
print(request.values.to_dict()) # {'user': '123', 'pwd': '456', 'id': '1', 'age': '20'}

注意啦!注意啦!

# 注意这里的坑来啦! 坑来啦!
# 如果url和form中的Key重名的话,form表单数据会先提交,则form中的同名的key中value会被url中的value覆盖
# http://127.0.0.1:5000/req?id=1&user=20
print(request.values.to_dict()) # {'user': 20 'pwd': '456', 'id': '1'}

request.args 与 request.form 的区别就是:

  • request.args 是获取url中的参数
  • request.form 是获取form表单中的参数

7.Flask中的formdata表单的文件传输

from flask import Flask, render_template, request
import os app = Flask(__name__)
app.debug = True @app.route("/login", methods=["POST", "GET"])
def login():
if request.method == "GET":
return render_template("login.html") if request.method == "POST":
username = request.form.get("username")
password = request.form.get("pwd")
print(username, password) # 获取文件对象
my_file = request.files.get("my_file") print(my_file)
# 指定文件保存路径
# filepath = os.path.join("templates", my_file.filename)
# my_file.save(filepath) # 保存文件,file_name获取文件名
my_file.save(my_file.filename)
return "200 OK" if __name__ == '__main__':
app.run()

login.html文件:

form表单提交文件时,必须指定文件类型:enctype="multipart/form-data"

...
<form action="" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="username"> 密码:<input type="password" name="pwd"> <input type="file" name="my_file"> <input type="submit" value="提交"></form>
...

8.Flask的常见错误

8.1当你点击提交出现这样的错

  

解决方案:

@app.route("/login",methods=["GET","POST"])

8.2设置session的时候

  

解决方法:设置秘钥

app.secret_key = "sdsfdsgdfgdfgfh"

附加:

  

Flask基础之返回值与form表单提交的更多相关文章

  1. 前端基础:form表单提交

    今天介绍下form表单提交经常用到的表单元素. 1:datalist元素,一般与input组建配合使用,以定义可能输入的值,例如: <!DOCTYPE html> <html lan ...

  2. javascprit form表单提交前验证以及ajax返回json

    1.今天要做一个手机验证码验证的功能.需求是前端页面点击发送 短信验证码,后台接收后通过ajax返回到前端,之后前端在提交时候进行验证.思路很简单,不过做的过程还是学到不少的东西. 1.ajax请求后 ...

  3. php 处理 form 表单提交多个 name 属性值相同的 input 标签

    一 问题 在公司的开发过程中,遇到了一个问题:如何处理 form 表单提交了多个 name 属性值相同的 input 标签?源码如下(源码是在 form 表单之中的): <!--{loop $a ...

  4. 非form表单提交的数据就要用@requestbody注解获取http传过来的值,尤其json

    非form表单提交的数据就要用@requestbody注解获取http传过来的值,尤其json

  5. form表单提交的时候,传过去的值是键值对的形式

    效果展示 第一种需求,点击input的时候,input的value发生改变 $('.group-wrapper input').click(function(){ $(this).val(0); // ...

  6. 使用form表单提交请求如何获取后台返回的数据?

    问题描述 一般的form表单提交是单向的:只能给服务器发送数据,但是无法获取服务器返回的数据,也就是无法读取HTTP应答包. 想要真正的半双工通讯一般需要使用Ajax, 但是Ajax对文件传输也很麻烦 ...

  7. form表单提交,后台怎么获取select的值?后台直接获取即可,和input方式一样。

    form表单提交,后台怎么获取select的值? 后台直接获取即可,和后台获取input的值方式一样. form提交后,后台直接根据select的name获取即可,即getPara("XXX ...

  8. jQuery Form 表单提交插件-----formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的 应用

    一.jQuery Form的其他api  1.  formSerialize 将表单序列化成查询串.这个方法将返回一个形如: name1=value1&name2=value2的字符串.是否可 ...

  9. jQuery Form 表单提交插件----Form 简介,官方文档,官方下载地址

     一.jQuery Form简介 jQuery Form插件是一个优秀的Ajax表单插件,可以非常容易地.无侵入地升级HTML表单以支持Ajax.jQuery Form有两个核心方法 -- ajaxF ...

随机推荐

  1. 测试之selenium简介

    目录 selenium是什么? 应该具备的知识 Selenium功能特性 Selenium的局限性 Selenium与QTP比较 Selenium工具套件 Selenium集成开发环境(IDE) Se ...

  2. Java判断文件类型

    通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...

  3. 冰多多团队Gamma阶段项目展示

    [冰多多]Gamma项目展示 冰多多项目: 语音coding助手 Gamma阶段目标: 推出一个更加完整的IDE,完善编辑器功能,优化UI 一. 团队成员的简介和个人博客地址 成员 角色 个人博客地址 ...

  4. Java编程思想之十八 枚举类型

    关键字enum可以将一组具名的值的有限集合创建为一种新的类型, 而这些具名的值可以作为常规的程序组件使用.这是一种非常有用的功能. 18.1 基本enum特性 创建enum时,编译器会为你生成一个相关 ...

  5. 记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法

    记一次查询超时的解决方案The timeout period elapsed...... https://www.cnblogs.com/wyt007/p/9274613.html Exception ...

  6. odoo前端必填提示

  7. SQLServer ---------- 安装SQLserver数据库

    1.安装SQLserver 数据2008 的地址 https://jingyan.baidu.com/article/948f592434b407d80ef5f97d.html?qq-pf-to=pc ...

  8. Zookeeper的介绍与基本部署

    目录 简介 架构 安装 StandAlone模式 1. 安装 2. 修改配置 3. 启动 4. 验证 5. 基本用法 Distributed模式 1. 配置hosts 2. 配置zoo.cfg 3. ...

  9. Antd中,Select 中value设值,导致placeholder不生效解决方法

    <Select key="sm2" placeholder="姓名" showSearch={true} allowClear={true} showAr ...

  10. protobuf, python Enum

    继承enum.Enum的python class,其实是一个, name-value的关系,可以直接className(value)得到一个类.比如 import enum class xx(enum ...