• flask学习笔记1


    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

    “微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

    默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。

    Werzeug

    """
    from werkzeug.wrappers import Request, Response
    from werkzeug.serving import run_simple
    
    @Request.application
    def hello(request):
        return Response('Hello World!')
    
    if __name__ == '__main__':
        # 当请求打来之后,自动执行:hello()
        run_simple('localhost', 4000, hello)
    """
    
    
    from werkzeug.wrappers import Request, Response
    from werkzeug.serving import run_simple
    
    class Foo(object):
        def __call__(self, *args, **kwargs):
            return Response('Hello World!')
    
    if __name__ == '__main__':
        # 当请求打来之后,自动执行:hello()
        obj = Foo()
        run_simple('localhost', 4000, obj)
    

     安装flask

    pip3 install flask

    基本使用

      

    """
    pip install flask
    pip3 install flask
    """
    
    from flask import Flask
    # 1. 实例化Flask对象
    app = Flask('xxxx')
    
    """
    1. 执行 app.route('/index')并获取返回值 xx
    2. 
        @xx
        def index():
            return 'Hello World'
    3. 执行 index = xx(index)
    本质: 
        {
            '/index': index
        }
    """
    @app.route('/index')
    def index():
        return 'Hello World'
    
    
    if __name__ == '__main__':
        app.run()
    

    1 装饰器的使用,template模板的定义 template_folder='templates’ static_folder='static'   默认路径也是这个  模板文件和静态文件

    2 methods=["GET","POST"]

    3 默认session的使用是在浏览器的加密的cookie中存放secret_key='****asdasds**'  写一端字符串 

    import functools
    from flask import Flask,render_template,request,redirect,session
    
    app = Flask('xxxx',template_folder="templates")
    app.secret_key = 'as923lrjks9d8fwlkxlduf'
    
    
    def auth(func):
        @functools.wraps(func)
        def inner(*args,**kwargs):
            user_info = session.get('user_info')
            if not user_info:
                return redirect('/login')
            return func(*args,**kwargs)
        return inner
    
    
    """
    {
        /order: inner函数, name: order
        /index: inner函数, name: index
    }
    """
    
    @app.route('/order',methods=['GET'])
    @auth
    def order():
        user_info = session.get('user_info')
        if not user_info:
            return redirect('/login')
    
        return render_template('index.html')
    
    
    @app.route('/index',methods=['GET'])
    @auth
    def index():
        return render_template('index.html')
    
    
    @app.route('/login',methods=['GET','POST'])
    def login():
        if request.method == "GET":
            return render_template('login.html')
        else:
            user = request.form.get('user')
            pwd = request.form.get('pwd')
            if user == 'alex' and pwd == '123':
                session['user_info'] = user
                return redirect('/index')
            # return render_template('login.html',msg = "用户名或密码错误",x =  123)
            return render_template('login.html',**{'msg':'用户名或密码错误'})
    
    @app.route('/logout',methods=['GET'])
    def logout():
        del session['user_info']
        return redirect('/login')
    if __name__ == '__main__':
        app.run()
    

    flask 准备阶段

       app = Flask(__name__)

        实例化Flask 对象

      @app.route('/index')

      

     

        把路由规则保存到Map类中

     

      run() 方法执行,socket的服务端开始运行,等待用户连接

    flask 运行阶段

      flask的运行的入口是__call__方法

      

       接着开始执行视图函数

     配置

    s1.py 
    	app.config.from_object('settings.TestingConfig')
    
    settings.py 
    	class BaseConfig(object):
    		DEBUG = False
    		SESSION_REFRESH_EACH_REQUEST = True
    
    	class ProConfig(BaseConfig):
    		pass
    
    	class DevConfig(BaseConfig):
    		DEBUG = True
    
    	class TestingConfig(BaseConfig):
    

     路由系统

        - 添加路由的本质
    @app.route('/index')
    def index():
        return "index"
    
    
    def order():
        return 'Order'
    app.add_url_rule('/order', None, order)
    
    
    
    FBV:
        @app.route('/index')
        def index():
            if 
            return "index"
            
        def order():
            return 'Order'
        app.add_url_rule('/order', None, order)
    CBV:
        class X1View(views.MethodView):
            methods = ['GET','POST']
            decorators = [auth, ]
    
            def get(self):
                return 'x1.GET'
    
            def post(self):
                return 'x1.POST'
    
    
        app.add_url_rule('/x1', view_func=X1View.as_view(name='x1'))  # name=endpoint

        

    源码码流程
        a. 生成路由关系
            [
                Rule(‘index’,函数),
                Rule(‘index’,函数),
                Rule(‘index’,函数),
                Rule(‘index’,函数),
            ]
    
        b. 用户请求来了
            - 获取用户U请求 并进行匹配
            - 将ctx(封装了请求相关所有数据的对象)放置到 “特殊的位置”
            
        c. 执行视图函数
    
        d. 将函数返回值响应给用户
    
        e. 将 ctx 在“特殊的位置”移除。

     模板文件

     1 import functools
     2 from flask import Flask,render_template,request,redirect,session,Markup
     3 
     4 app = Flask('xxxx',template_folder="templates")
     5 app.secret_key = 'as923lrjks9d8fwlkxlduf'
     6 
     7 @app.template_global()
     8 def sb(a1,a2):
     9     return a1+a2
    10 @app.template_filter()
    11 def db(a1,a2,a3):
    12     return  a1+a2+a3
    13 def fffff(value):
    14     return Markup("<input type='text' value=%s>"%(value))
    15 
    16 @app.route('/index',methods=['GET'])
    17 def index():
    18     context = {
    19         'k1': 'v1',
    20         'k2': [11, 22, 33],
    21         'k3': {
    22             'name': 'oldboy',
    23             'age': 56
    24         },
    25         'k4': fffff
    26     }
    27     return render_template('index.html',**context)
    28 
    29 
    30 if __name__ == '__main__':
    31     app.run()
    模板的app
    {%extends 'layout.html'%}
    {%block content%}
    <h2>index</h2>
        <div>
            {%include 'sakula.html'%}
        </div>
        <div>
           {{k4('hebe')}}
       </div>
       <div>
           {{k1}}
       </div>
       <div>{{k2}}</div>
       <div>
           {% for k,v in k3.items()%}
                {{k}}--{{v}}
           {%endfor%}
       </div>
       <div>
           {{k3.name}}
           {{k3['name']}}
           {{k3.get('name')}}
       </div>
       <div>
           全局函数:{{sb(1,2)}}
           全局函数2:{{1|db(2,3)}}
       </div>
    {%endblock%}
    模板的html


      

      

  • 相关阅读:
    【转载】Linux的进程间通信-信号量
    【转载】高性能数据库连接池的内幕
    【转载】我是一块硬盘(下)
    【转载】我是一块硬盘(上)
    69. Sqrt(x)
    68. Text Justification
    67. Add Binary
    66. Plus One
    65. Valid Number
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/hexintong/p/8907312.html
Copyright © 2020-2023  润新知