Flask框架

  下面我们来学习一下另一个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

  

posted @ 2019-01-07 16:18  不喜欢酸甜的刘青阳  阅读(128)  评论(0编辑  收藏  举报