一、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"
附加: