下面我们来学习一下另一个python框架Flask,和django框架相比,django是"大而全",但是浪费资源;而flask是"小而精,三方组件全",但是稳定性相对较差.
flask仅需很简单的一段代码就可以实现一个程序:
from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "Hello World" app.run()
一.Response三剑客
HttpResponse:return "Hello World"返回字符串至客户端 from flask import render_template render: renturn render_template 与Django中的render使用一致,返回模板由浏览器渲染 from flask import redirect redirect: renturn redirect("/login") #302 跳转,重定向URL
二.Flask中小儿子
(1)
from flask import jsonify return jsonify({name:111}) #返回json标准的字符串 Content-Type:application/json
(2)
from flask import send_file return send_file(path) #打开文件并返回文件内容(自动识别文件格式)
(3)flask中的request有:get,post,delete,put
from flask import request request.method #请求方式 request.form #存放formdata中的数据,to_dict 序列化字典 request.args #获取URL中的数据,to_dict 序列化成字典 request.url #访问完整路径 request.path #路由地址 request.host #主机地址 request.values #获取formdata and URL中的数据 不要用to_dict request.json #如果提交时请求头中的Content-Type:application/json 字典操作 request.data #如果提交时请求头中的Content-Type 无法被识别,将请求体的原始数据存放 byte request.cookies #获取Cookie中的数据 request.headers #获取请求头 request.files #序列化文件存储 save()
三.Jinja2
{{ }} 引用变量,执行函数 {% %} 逻辑代码 |safe /Markup 安全标签字符串 @app.template_global() 全局 @app.template_filter() 过滤 {% macro create_input(na,ty) %} {{ na }} : <input type="{{ ty }}" name="{{ na }}"> {% endmacro %} {{ create_input("username","text") }}
四.Flask中的Session
app.secret_key = "加密字符串" #用于序列化和反序列化,session信息
由于Flask中默认Session存放位置--客户端的Cookies中,所以Session需要加密,用到secret_key
请求进入视图函数,带上cookie将Session从cookie序列化出来,通过secret_key反序列化成字典
五.Flask路由
1.endpoint 反向生成URL from flask import url for 默认视图函数名 2.methods 允许的请求方式,默认GET,多种请求添加到列表中,比如["GET","POST"] 3."/index/<int:page>" 动态路由参数 def index(page): 4.strict_slashes=False 是否严格遵循路由地址 /index/(有/不行) /index 5.redirct_to = "/login" 永久重定向 状态码 301 6.defaults = {nid:1} 默认参数 def index(nid):
六.Flask实例化配置
1.template_folder = "templates" 默认模板存放目录 2.static_folder = "static" 默认静态文件存放目录 3.static_url_path = "/static" 静态文件访问路径 "/"+static_folder
蓝图的url_prefix 特殊配置,加url前缀
七.Flask对象配置
app = Flask(__name__) app.config.from_obj(class)
八.蓝图 当成app
from flask import Blueprint app01 = Blueprint("app01",__name)
@app01.route("/app01")
def appfinc():
app.register_bluepeint(app01)
九.特殊装饰器:
1.before_request 发生在请求进入视图函数之前
@app.before_request def be1 def be2 def be3
2.after_request 发生在响应返回客户端之前
@app.after_request def af1 def af2 def af3 自下而上执行 正常: be1 - be2 -be3 - af3 - af2 - af1 异常:be1 - af3 - af2 - af1
3.errorhandler #重定义错误信息
@app.errorhandler(404) def error404(error_info):
十.CBV - Flask
from flask import views class Login(views.MethodView): methods = ["GET","POST"] decorators = [app.route] def get(self): print(url_for("my_login")) return render_template("login.html") def post(self): return "登录成功" app.add_url_rule("/",view_func=Login.as_view("my_login"))
十一.websocket
flask的websocket建立一个聊天室.
后端
from flask import Flask,render_template,request from geventwebsocket.handler import WebSocketHandler from geventwebsocket.websocket import WebSocket from gevent.pywsgi import WSGIServer import json app=Flask(__name__) user_socket_list = [] user_socket_dict = {} @app.route("/ws/<username>") def ws(username): user_socket = request.environ.get("wsgi.websocket") #type:WebSocket if user_socket: user_socket_dict[username] = user_socket print(len(user_socket_dict),user_socket_dict) while 1: msg = user_socket.receive() #收件人 消息 发件人 msg_dict = json.loads(msg) msg_dict["from_user"] = username to_user = msg_dict.get("to_user") u_socket = user_socket_dict.get(to_user) #type:WebSocket u_socket.send(json.dumps(msg_dict)) @app.route("/") def index(): return render_template(ws.html) if __name__ == '__main__': http_serv = WSGIServer(("0.0.0.0",9527),app,handler_class=WebSocketHandler) http_serv.serve_forever()
十二.Flask的组件
1.Flask-Session
from flask_session import Session app.config["SESSION_TYPE"] = "redis" app.config["SESSION_REDIS"] = Redis(host="127.0.0.1",port=6379,db=6) Session(app) session["key"] = "value"
Flask中的session需要执行 session_interface - open_session
2.WTForms - ModelForm