• 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

      

  • 相关阅读:
    angularjs的$filter使用
    ngResource提交json数据如何带参数
    angularjs可交互的directive
    AngularJS $http配置为form data 提交
    让AngularJS的$http 服务像jQuery.ajax()一样工作
    mysql修改密码
    四种常见的 POST 提交数据方式
    跨域API
    cmd复制文件
    git查看日志
  • 原文地址:https://www.cnblogs.com/liuqingyang/p/10233915.html
Copyright © 2020-2023  润新知