zoukankan      html  css  js  c++  java
  • Flask基础

    基础:
        1. 配置文件
        2. 路由系统
        3. 视图
        4. 请求相关
        5. 响应
        6. 模板渲染
        7. session
        8. 闪现
        9. 中间件
        10. 蓝图(blueprint)
        11. 特殊装饰器
        
    内容详细:
        知识点:
            - 给你一个路径 “settings.Foo”,可以找到类并获取去其中的大写的静态字段。
            
                settings.py
                    class Foo:
                        DEBUG = True
                        TEST = True
                    
                xx.py
                    import importlib

                    path = "settings.Foo"

                    p,c = path.rsplit('.',maxsplit=1)
                    m = importlib.import_module(p)
                    cls = getattr(m,c)

                    # 如果找到这个类?
                    for key in dir(cls):
                        if key.isupper():
                            print(key,getattr(cls,key))
        1. 配置文件
            
            app.config.from_object("settings.DevelopmentConfig")
            
            
            class Config(object):
                DEBUG = False
                TESTING = False
                DATABASE_URI = 'sqlite://:memory:'


            class ProductionConfig(Config):
                DATABASE_URI = 'mysql://user@localhost/foo'


            class DevelopmentConfig(Config):
                DEBUG = True


            class TestingConfig(Config):
                TESTING = True
        2. 路由系统
            - endpoint,反向生成URL,默认函数名
            - url_for('endpoint') / url_for("index",nid=777)
            - 动态路由:
                @app.route('/index/<int:nid>',methods=['GET','POST'])
                def index(nid):
                    print(nid)
                    return "Index"
            
        3. FBV
        
        
        4. 请求相关
            # 请求相关信息
            # request.method
            # request.args
            # request.form
            # request.values
            # request.cookies
            # request.headers
            # request.path
            # request.full_path
            # request.script_root
            # request.url
            # request.base_url
            # request.url_root
            # request.host_url
            # request.host
            # request.files
            # obj = request.files['the_file_name']
            # obj.save('/var/www/uploads/' + secure_filename(f.filename))
            
        5. 响应:
                响应体:
                    return “asdf”
                    return jsonify({'k1':'v1'})
                    return render_template('xxx.html')
                    return redirect()
                
                定制响应头:   
                    obj = make_response("asdf")
                    obj.headers['xxxxxxx'] = '123'
                    obj.set_cookie('key', 'value')
                    return obj
            
            
        示例程序:学生管理
            
            版本一:
                @app.route('/index')
                def index():
                    if not session.get('user'):
                        return redirect(url_for('login'))
                    return render_template('index.html',stu_dic=STUDENT_DICT)
            版本二:
                import functools
                def auth(func):
                    @functools.wraps(func)
                    def inner(*args,**kwargs):
                        if not session.get('user'):
                            return redirect(url_for('login'))
                        ret = func(*args,**kwargs)
                        return ret
                    return inner
            
                @app.route('/index')
                @auth
                def index():
                    return render_template('index.html',stu_dic=STUDENT_DICT)
            
                应用场景:比较少的函数中需要额外添加功能。
                
            版本三:before_request
                @app.before_request
                def xxxxxx():
                    if request.path == '/login':
                        return None

                    if session.get('user'):
                        return None

                    return redirect('/login')

            
        6. 模板渲染
            - 基本数据类型:可以执行python语法,如:dict.get()  list['xx']
            - 传入函数
                - django,自动执行
                - flask,不自动执行
            - 全局定义函数
                @app.template_global()
                def sb(a1, a2):
                    # {{sb(1,9)}}
                    return a1 + a2

                @app.template_filter()
                def db(a1, a2, a3):
                    # {{ 1|db(2,3) }}
                    return a1 + a2 + a3
            - 模板继承
                layout.html
                    <!DOCTYPE html>
                    <html lang="zh-CN">
                    <head>
                        <meta charset="UTF-8">
                        <title>Title</title>
                        <meta name="viewport" content="width=device-width, initial-scale=1">
                    </head>
                    <body>
                        <h1>模板</h1>
                        {% block content %}{% endblock %}
                    </body>
                    </html>
                
                tpl.html
                    {% extends "layout.html"%}


                    {% block content %}
                        {{users.0}}
                        

                    {% endblock %}    
            - include
        
        
                {% include "form.html" %}
                
                
                form.html
                    <form>
                        asdfasdf
                        asdfasdf
                        asdf
                        asdf
                    </form>
            - 宏
                {% macro ccccc(name, type='text', value='') %}
                    <h1>宏</h1>
                    <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
                    <input type="submit" value="提交">
                {% endmacro %}

                {{ ccccc('n1') }}

                {{ ccccc('n2') }}
                
            - 安全
                - 前端: {{u|safe}}
                - 前端: MarkUp("asdf")
            
        
        7. session
            当请求刚到来:flask读取cookie中session对应的值:eyJrMiI6NDU2LCJ1c2VyIjoib2xkYm95,将该值解密并反序列化成字典,放入内存以便视图函数使用。
            视图函数:
                @app.route('/ses')
                def ses():
                    session['k1'] = 123
                    session['k2'] = 456
                    del session['k1']

                    return "Session"

                        
                            
                        session['xxx'] = 123
                        session['xxx']
                        
            当请求结束时,flask会读取内存中字典的值,进行序列化+加密,写入到用户cookie中。
        
        
        8. 闪现,在session中存储一个数据,读取时通过pop将数据移除。
            from flask import Flask,flash,get_flashed_messages
            @app.route('/page1')
            def page1():

                flash('临时数据存储','error')
                flash('sdfsdf234234','error')
                flash('adasdfasdf','info')

                return "Session"

            @app.route('/page2')
            def page2():
                print(get_flashed_messages(category_filter=['error']))
                return "Session"
            
        
        9. 中间件
            - call方法什么时候出发?
                - 用户发起请求时,才执行。
            - 任务:在执行call方法之前,做一个操作,call方法执行之后做一个操作。
                class Middleware(object):
                    def __init__(self,old):
                        self.old = old

                    def __call__(self, *args, **kwargs):
                        ret = self.old(*args, **kwargs)
                        return ret


                if __name__ == '__main__':
                    app.wsgi_app = Middleware(app.wsgi_app)
                    app.run()
                
        
        10. 特殊装饰器
        
            1. before_request
            
            2. after_request
            
                示例:
                    from flask import Flask
                    app = Flask(__name__)


                    @app.before_request
                    def x1():
                        print('before:x1')
                        return '滚'

                    @app.before_request
                    def xx1():
                        print('before:xx1')


                    @app.after_request
                    def x2(response):
                        print('after:x2')
                        return response

                    @app.after_request
                    def xx2(response):
                        print('after:xx2')
                        return response



                    @app.route('/index')
                    def index():
                        print('index')
                        return "Index"


                    @app.route('/order')
                    def order():
                        print('order')
                        return "order"


                    if __name__ == '__main__':

                        app.run()
            
            3. before_first_request
            
                from flask import Flask
                app = Flask(__name__)

                @app.before_first_request
                def x1():
                    print('123123')


                @app.route('/index')
                def index():
                    print('index')
                    return "Index"


                @app.route('/order')
                def order():
                    print('order')
                    return "order"


                if __name__ == '__main__':

                    app.run()

            
            4. template_global
            
            5. template_filter
            
            6. errorhandler
                @app.errorhandler(404)
                def not_found(arg):
                    print(arg)
                    return "没找到"

  • 相关阅读:
    Silverlight实例教程
    c#.net大文件上传(切片)
    ASP.NET大文件上传(切片)
    jsp大文件上传(切片)
    php大文件上传(切片)
    本地图文直接复制到博客编辑器中
    本地图文直接复制到CMS编辑器中
    本地图文直接复制到SiteFactory编辑器中
    本地图文直接复制到动易CMS编辑器中
    本地图文直接复制到帝国CMS编辑器中
  • 原文地址:https://www.cnblogs.com/l-jie-n/p/10079982.html
Copyright © 2011-2022 走看看