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
原文地址:https://www.cnblogs.com/mengbin0546/p/9596098.html