zoukankan      html  css  js  c++  java
  • Flask初识

        Flask特点以及对比

      

    Flask:

    1. 轻量级,短小精悍.
    2. 快,三行代码开启服务.

    缺点:

    1. 你们还不会,组件大部分来源第三方,flask-admin,flask-session。
    2. Flask 大版本更新,组件更新速度慢.
    3.  

    Django 特点:

    1. 大而全, admin ,models, Form ,ModelForm,中间件,Session
    2. 一个框架解决所有问题.

          

    缺点:

    1. 一旦启动,所有资源全部加载,     用不到的,资源浪费.
    2. 结果复杂,太大了,
    3. 所有的组件,全部由Django自身控制.

    Tornado;       

    1. 原生支持websocket
    2. 异步IO
    3. 非阻塞

    缺点:

    三方及原生组件 几乎为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
  • 相关阅读:
    【转】千万级并发实现的秘密:内核不是解决方案,而是问题所在!
    漫话NUMA
    【转】为什么要内存对齐 Data alignment: Straighten up and fly right
    【转】内存地址对齐运算
    DPDK收发包处理流程-----(一)网卡初始化
    Nginx WebSocket proxying example
    nginx example
    kerberos-ldap linux账户集中管理认证
    利用i节点删除乱码文件
    linux sar命令详解
  • 原文地址:https://www.cnblogs.com/mengbin0546/p/9596098.html
Copyright © 2011-2022 走看看