特色: 1.Django的特色是大而全,集成了不少组件,属于全能型框架 2.tornado的主要特色是原生异步非阻塞,在IO密集型和多任务处理上占有绝对优点,属于专一型框架 3.flask的的特色是小而轻,原生组件几乎为0 使用类型: 1.Django适用于大型的web应用,因为内部的组件足够强大,可使开发一鼓作气 2.tornado适用于api后端应用,常服务于游戏后台,由于内部的异步非阻塞很是稳 3.简单的应用用flask很是简洁,大型的应用Django和flask均可以 缺点: 1.djnago的缺点是资源一次性所有加载,会形成资源浪费 2.tornado太干净了,连个session都不支持 3.flask相对不妥当,因为依赖第三方
pip3 install flask
第三方组件:http://flask.pocoo.org/html
from flask import Flask ,jsonify app = Flask(__name__) app.run(debug=True)
from flask import Flask #导入flask类 app = Flask(__name__) #实例化一个flask对象app @app.route("/") #router装饰器 def index(): #视图函数 return "aaa" app.run("0.0.0.0",5000,debug=True) #启动flask web应用
1.Flask中的HttpResponse其实 就是直接返回字符串前端
@app.route("/") def index(): return "aaa"
2.Flask中的Redirect python
from flask import Flask,redirect app = Flask(__name__) @app.route("/") def index(): return redirect("/index") #在访问"/"时,重定向到"/index" @app.route("/index") def index1(): return "重定向" app.run("0.0.0.0",5000,debug=True)
3.Flask中的renderweb
from flask import Flask,render_template app = Flask(__name__) @app.route("/index") def index1(): return render_template('index.html') app.run("0.0.0.0",5000,debug=True) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>这是index.html</div> </body> </html>
4.除Render Redirect HttpResponse外,Flask特有的jsonify与senf_filejson
(1)jsonify(与json.dumps不一样的是会有请求头application/json)flask
from flask import Flask,render_template,jsonify app = Flask(__name__) @app.route("/") def index1(): return jsonify({"aa":1}) app.run("0.0.0.0",5000,debug=True)
(2)send_file后端
from flask import Flask,render_template,send_file app = Flask(__name__) @app.route("/") def index1(): name="shy" return send_file("dvd.mp4") app.run("0.0.0.0",5000,debug=True)
send_file能够返回文字,文件,图片,视频等等,自动识别文件是什么类型的文件,在Content-Type:后加文件类型api
get post delete put
option trace connnect head
methods参数安全
from flask import Flask,render_template,send_file app = Flask(__name__) @app.route("/",methods=["POST"])#规定了methods参数后,其余请求就没法访问该视图函数 def index1(): name="shy" return send_file("dvd.mp4") app.run("0.0.0.0",5000,debug=True)
request.method:获取请求方式的名字 request.form:存放formdata中的数据(前端中表单中的数据) request.args:获取url中的数据 如:ImmutableMultiDict([('a', '1')]),能够to_dict()转化成字典 request.url:访问的完整路径 如:http://127.168.13.61:5000/?a=1 request.path:路由地址 如:/index request.host:主机地址 如:127.168.13.61:5000 request.host-url:http+主机地址 如:http://127.168.13.61:5000/index request.json:若是请求头中的contentType:aplication/json,直接序列化 request.data:若是请求头中的contentType:aplication/dfsg,不知道怎么序列化时没法被识别,请求体中的原始数据放到这 request.values:用于查看数据一般不用来获取数据 如:CombinedMultiDict([ImmutableMultiDict([('a', '1')]), ImmutableMultiDict([])]) request.files:获取文件信息 request.cookies:获取cookie中的数据 request.headers:获取请求头
注:to_dict方法cookie
to_dict方法:相似这样ImmutableMultiDict,CombinedMultiDict,像字典同样的数据类型,均可以使用to_dict方法,request.values.to_dict():会出现覆盖问题
1.引用变量(字典的传递)
from flask import Flask,redirect,render_template,request app = Flask(__name__) STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'} @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陆失败" @app.route("/index") def index(): return render_template('index.html',stu=STUDENT) app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>这是index.html</div> 学生信息{{ stu }} <table> <tr> <td>{{ stu.name }}</td> <td>{{ stu.age }}</td> <td>{{ stu.gender }}</td> </tr> <tr> </tr> </table> </body> </html>
2.逻辑代码(列表的传递)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>这是index.html</div> 学生信息{{ stu }} <table> <tr> <td>{{ stu.name }}</td> <td>{{ stu.age }}</td> <td>{{ stu.gender }}</td> </tr> {% for foo in lis %} <tr> <td>{{ foo.name }}</td> <td>{{ foo.age }}</td> <td>{{ foo.gender }}</td> </tr> {% endfor %} </table> </body> </html>
3.Markup的使用(至关于 |safe,安全标签字符串)(标签字符串的传递)
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) ############################## word="<p>hahaha</p>" word1=Markup(word) ############################## @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陆失败" @app.route("/index") def index(): return render_template('index.html',stu=STUDENT,lis=STUDENT_LIST,word=word1) app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>这是index.html</div> ########################## {{ word }} ########################## </body> </html>
4.函数的传递
(1)单个函数的传递
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) def add(a,b): return a+b @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陆失败" @app.route("/index") def index(): return render_template('index.html',func=add) app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>这是index.html</div> 学生信息{{ stu }} {{ func(1,2) }} </body> </html>
(2)template_global,若是数量多的话,变成全局均可以使用的函数
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) ############################# @app.template_global()#template_global是一个特殊的装饰器 def add(a,b): return a+b ############################## @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陆失败" @app.route("/index") def index(): return render_template('index.html') app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>这是index.html</div> 学生信息{{ stu }} {{ add(2,2) }} </body> </html>
(3)能够传递参数的全局函数
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) @app.template_filter() def fil(a,b,c): return a+b+c @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陆失败" @app.route("/index") def index(): return render_template('index.html') app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>这是index.html</div> 学生信息{{ stu }} {{ 1 |fil(2,3) }} </body> </html>
5.宏macro
from flask import Flask,redirect,render_template,request,Markup app = Flask(__name__) @app.route("/login",methods=["GET","POST"]) def login(): print(request.form) if request.method=="GET": return render_template('login.html') if request.form.get("username")=="aaa" and request.form.get("password")=="111": return redirect('/index') else: return "登陆失败" @app.route("/index") def index(): return render_template('index.html') app.run("0.0.0.0",5002,debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div>这是index.html</div> 学生信息{{ stu }} #################定义宏##################### {% macro create_input(na,ty) %} 用户名:{{ na }}<input type="{{ ty }}" name="{{ na }}"> {% endmacro %} ##################给宏传值##################### {{ create_input("username","text") }} </body> </html>
from flask import session app = Flask(__name__) app.secret_key = "DragonFire" #用来加密的字符串
设置session
session["username"]="shy"
获取session
session.get("username")#若是出现KeyError,说明没有这个key的session
session机制:flask中的session是存储在cookie中的,为了节省flask的开销