Flask初识
Flask特点以及对比
Flask:
- 轻量级,短小精悍.
- 快,三行代码开启服务.
缺点:
- 你们还不会,组件大部分来源第三方,flask-admin,flask-session。
- Flask 大版本更新,组件更新速度慢.
Django 特点:
- 大而全, admin ,models, Form ,ModelForm,中间件,Session
- 一个框架解决所有问题.
缺点:
- 一旦启动,所有资源全部加载, 用不到的,资源浪费.
- 结果复杂,太大了,
- 所有的组件,全部由Django自身控制.
Tornado;
- 原生支持websocket
- 异步IO
- 非阻塞
缺点:
三方及原生组件 几乎为0
实例1 三行代码实现:
#三行实现大帅比版Flask # from flask import Flask # app =Flask(__name__) # app.run()
实例2 六行代码实现:
#六行 from flask import Flask app =Flask(__name__) @app.route("/") def index(): return "hello world" if __name__ == '__main__': app.run("127.0.0.1",9527,debug=True) #ran_simple(host,port,obj_or_func())
flask 中的返回值.
HttpResponse ==return "ok"
render==render_template
redirect== redirect
return send_file() # 将一个文件打开,然后返回.
from werkzeug.wrappers import Request, Response from werkzeug.serving import run_simple @Request.application def app(request): print(request)
print(request.method)
print(request.url)
print(dir(request))
return Response("OK!") run_simple("0.0.0.0", 8081, app)
session的配置。
from flask import Flask,render_template,request,redirect,session app =Flask(__name__) app.secret_key="hello" @app.route("/login",methods=["GET","POST"]) def login(): if request.method =="GET": return render_template("login.html") user =request.form.get("username") pwd = request.form.get("password") if user =="hailong" and pwd =="hl" : session["user_info"] =user return redirect("index") return render_template("login.html",msg="用户名密码错误") @app.route("/index") def index(): user_info =session.get("user_info") if not user_info: return redirect("/login") return render_template("/index.html") if __name__ == '__main__': app.run()
jinjia2
@app.route("/index")
def index():
user_info =session.get("user_info")
if not user_info:
return redirect("/login")
kuang_list =[
{"id":1,"name":"一矿","address":"大同"},
{"id":2,"name":"二矿","address":"大同"},
{"id":3,"name":"三矿","address":"大同"},
]
return render_template("/index.html",klist=kuang_list)
# return render_template("/index.html",**{"klist":kuang_list})
if __name__ == '__main__':
app.run()
<h1>欢迎来到python第11期</h1> <table border="1"> <thead> <tr> <th>ID</th> <th>名称</th> <th>地址</th> <th>地址</th> <th>地址</th> </tr> </thead> <tbody> {% for item in klist %} <tr> <td>{{item.id}}</td> <td>{{item.name}}</td> <td>{{item.address}}</td> <td>{{item.get("address")}}</td> # 一种方法(字典取值) <td>{{item.get("addrxxxess","参数")}}</td> #另外一种方法.(字典取值) </tr> {%endfor%} </table> {{klist.0}}<br> {{klist[0]}} </tbody> </body> </html>
装饰器
import functools
def auth(func):
# @functools.wraps(func)
def inner(*args,**kwargs):
print("before")
ret =func(*args,**kwargs)
print("after")
return ret
return inner
@auth
def index():
print(index.__name__)
index()
执行的结果为
before
inner
after
如果加functools
执行结果为:
before index after
functools会伪装的更像原函数。
带装饰器的认证
from flask import Flask,render_template,request,redirect,session app =Flask(__name__) app.secret_key="hello" import functools def auth(func): #装饰器 @functools.wraps(func) def inner(*args,**kwargs): print("before") if not session.get("user_info"): return redirect("/login") ret =func(*args,**kwargs) print("after") return ret return inner @app.route("/login",methods=["GET","POST"]) def login(): if request.method =="GET": return render_template("login.html") user =request.form.get("username") pwd = request.form.get("password") if user =="hailong" and pwd =="hl" : session["user_info"] =user return redirect("index") return render_template("login.html",msg="用户名密码错误") @app.route("/index") @auth def index(): # user_info =session.get("user_info") # if not user_info: # return redirect("/login") kuang_list =[ {"id":1,"name":"一矿","address":"大同"}, {"id":2,"name":"二矿","address":"大同"}, {"id":3,"name":"三矿","address":"大同"}, ] return render_template("/index.html",klist=kuang_list) # return render_template("/index.html",**{"klist":kuang_list}) @app.route("/detail") @auth def detail(): request.args.get("nid") return render_template("/detail.html") @app.route("/logout") def logout(): del session["user_info"] return redirect("/login") if __name__ == '__main__': app.run()
app.before_request 进行登录验证,比装饰器还要简单
from flask import Flask,render_template,request,redirect,session app =Flask(__name__) app.secret_key="hello" @app.before_request def xxxx(): if request.path =="/login": return None if not session.get("user_info"): return redirect("/login")
中间件这个是把所有的视图都进行认证 ,
而装饰器可以指定相应的视图进行认证.
from flask import Flask,render_template,request,redirect,session app =Flask(__name__) app.secret_key="hello" @app.before_request def b1(): print("b1") return "执行了我后,下面的就不在执行了" @app.before_request def b2(): print("b2") @app.route("/index") def index(): print("index") return "hello" if __name__ == '__main__': app.run()
打印结果:
b1
before request and after request
from flask import Flask,render_template,request,redirect,session app =Flask(__name__) app.secret_key="hello"
【b1,b2】 处理顺序 @app.before_request def b1(): print("b1") @app.before_request def b2(): print("b2")
【a2,a1】 把【a1,a2】给reverse一下 @app.after_request def r1(response): print("a1") return response @app.after_request def r2(response): print("a2") return response @app.route("/index") def index(): print("index") return "hello" if __name__ == '__main__': app.run()
打印结果:
b1
b2
index
a2
a1
Flask中间件有return返回值的走向.
django中间件的返回值走向;
s10day116 内容回顾: 第一部分: 1. 简述 OSI 七层协议。 2. 什么是C/S和B/S架构? 3. 简述 三次握手、四次挥手的流程。 4. 什么是arp协议? 5. TCP和UDP的区别? 6. 什么是局域网和广域网? 7. 为何基于tcp协议的通信比基于udp协议的通信更可靠? 8. 什么是socket?简述基于tcp协议的套接字通信流程。 9. 什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象? 10. 什么是防火墙以及作用? - 设备 - 软件 - iptables 第二部分: 1. 手写装饰器给某个函数添加上,计算函数执行时间; def wapper(func): @functools.wapper(func) def inner(*args,**kwargs): ret = func(*args,**kwargs) return ret return inner 问题:元数据未保留。 2. 面向对象三大特性 - 封装,将一大堆的值打包封装到一个对象中。 - 继承 - 多态 今日内容: 1. 快速使用 2. 知识点: - 配置相关 - wsgi - “中间件” - 路由系统 - 视图函数 - 模板引擎 - session 内容详细: 1. 快速使用Flask 安装:pip3 install flask 示例程序:自动挖煤系统 2. hello world 3. 路由系统 - 默认使用app.route('/index',methods=['GET',"POST"]) - 想要给视图添加装饰器: - 装饰器必须设置functools.wappers - 紧挨着放在视图之上 4. 视图函数 - 请求相关: - request.form - request.args - request.method - reqeust.path - 响应相关: - return "xxx" - return render_template('index.html') - return redirect() 5. 模板 - 索引: - . - python语法 - 模板继承 6. 保存会话信息:session (字典) - 放在加密的cookie中 - 依赖: app.secret_key = "asdfasdfasdf" -操作: session['k1'] = 123 session.get('k1') del session['k1'] 7. 特殊装饰器: - before_request - after_request 8. 什么是wsgi? wsgi,web服务网管接口,是一套协议; 实现wsgi协议的模块: wsgiref,本质上就是编写一个socket服务端用于接收用户请求;(django) werkzeug,本质上就是编写一个socket服务端用于接收用户请求;(flask) werkzeug示例: from werkzeug.wrappers import Request, Response from werkzeug.serving import run_simple @Request.application def hello(request): # ... # Flask框架 # return Response('Hello World!') if __name__ == '__main__': run_simple('localhost', 4000, hello) 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html