Flask基础之返回值三剑客与form表单提交

岁酱吖の 提交于 2019-12-05 00:25:14

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

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

  • Django 通常用于大型Web应用由于内置组件足够强大所以使用Django开发可以一气呵成
  • Django 优点是大而全,缺点也就暴露出来了,这么多的资源一次性全部加载,肯定会造成一部分的资源浪费

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

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

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

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

二、Flask的安装

pip install Flask

三、Flask的第一个简单应用

  实现一个简单的web程序:

 1 from flask import Flask  #导入Flask类
 2 
 3 # __name__指定当前文件名flask1.py
 4 app = Flask(__name__)  #实例化一个Flask对象
 5 
 6 
 7 # 指定路由,app中的route装饰器
 8 @app.route("/")
 9 def home():  #视图函数
10     return "hello world!"   #相当于HttpResponse返回数据
11 
12 
13 if __name__ == '__main__':
14     # 定义访问ip与port
15     app.run("0.0.0.0", 5050)

  web页面展示:

  

四、Flask中的render_template

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

 1 from flask import Flask, render_template  #导入Flask类
 2 
 3 # __name__指定当前文件名flask1.py
 4 app = Flask(__name__)  #实例化一个Flask对象
 5 
 6 
 7 # 指定路由,app中的route装饰器
 8 @app.route("/home")
 9 def home():
10     return render_template("home.html")
11 
12 
13 if __name__ == '__main__':
14     # 定义访问ip与port
15     app.run("0.0.0.0", 5050)

  home.html文件:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 
 9 <h1>success!</h1>
10 
11 </body>
12 </html>

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

  

五、Flask中的redirect重定向

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

 1 from flask import Flask,redirect #导入Flask类
 2 
 3 # __name__指定当前文件名flask1.py
 4 app = Flask(__name__)  #实例化一个Flask对象
 5 
 6 
 7 # 指定路由,app中的route装饰器
 8 @app.route("/reback")
 9 def reback():
10     # 重定向指定路经前需要加“/”
11     return redirect("/index")
12 
13 
14 if __name__ == '__main__':
15     # 定义访问ip与port
16     app.run("0.0.0.0", 5050)

 六、Flask中的formdata表单提交

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

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

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

 1 from flask import Flask, render_template, request
 2 import os
 3 
 4 app = Flask(__name__)
 5 app.debug = True
 6 
 7 
 8 @app.route("/login", methods=["POST", "GET"])
 9 def login():
10     if request.method == "GET":
11         # 获取URL中的参数,例如传入参数:http://127.0.0.1:5000/login?id=1
12         print(request.args.get("id"))
13         # 获取URL中的参数 转换成 字典
14         print(request.args.to_dict())
15         # 获取请求原始信息
16         print(request.environ)
17         # 路由地址 /login
18         print(request.path)
19         # 获取访问路径
20         print(request.url)  # http://127.0.0.1:5000/login?id=1
21         # 获取URL头,不包含参数 /login
22         print(request.base_url)  # http://127.0.0.1:5000/login
23 
24         return render_template("login.html")
25 
26     if request.method == "POST":
27         # 请求头中的数据
28         print(request.headers)
29 
30         print(request.json)  # 请求头中 Content-type:application/json 数据序列化 request.json
31         print(request.data)  # 请求头中 Content-type 不包含 Form or data
32 
33         # Formdata 和 Args查询参数 中的数据
34         print(request.values)
35 
36         username = request.form.get("user")
37         password = request.form.get("pwd")
38         print(username, password)
39 
40         return "200 OK"
41 
42 
43 if __name__ == '__main__':
44     app.run()

  HTML的form表单:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 
 9 <form action="" method="post" enctype="multipart/form-data">
10     用户名:<input type="text" name="user">
11     密码:<input type="password" name="pwd">
12     <input type="submit" value="提交">
13 </form>
14 
15 <script></script>
16 </body>
17 </html>

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

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

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

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

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

  注意啦!注意啦!

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

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

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

七、Flask中的formdata表单的文件传输

 1 from flask import Flask, render_template, request
 2 import os
 3 
 4 app = Flask(__name__)
 5 app.debug = True
 6 
 7 @app.route("/login", methods=["POST", "GET"])
 8 def login():
 9     if request.method == "GET":
10         return render_template("login.html")
11 
12     if request.method == "POST":
13         username = request.form.get("username")
14         password = request.form.get("pwd")
15         print(username, password)
16 
17         # 获取文件对象
18         my_file = request.files.get("my_file")
19 
20         print(my_file)
21         # 指定文件保存路径
22         # filepath = os.path.join("templates", my_file.filename)
23         # my_file.save(filepath)
24 
25         # 保存文件,file_name获取文件名
26         my_file.save(my_file.filename)
27         return "200 OK"
28 
29 
30 if __name__ == '__main__':
31     app.run()

  login.html文件:

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

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

 八、Flask的常见错误

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

  

  解决方案:

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

   2、设置session的时候

  

  解决方法:设置秘钥

app.secret_key = "sdsfdsgdfgdfgfh"

  附加:

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!