知识点总结

回顾:
    1.谈谈你对django和flask的认识。
        django是一个比较大的重量级web框架,组件齐全适合大项目的开发,组件例如有缓存,orm,admin,form,分页等
        flask是一个比较轻量级的web框架,特点,短小精悍,可扩展性强,适合开发小项目,flask学习成本高,光组件就得搞一天
    2.flask和django最大的不同点:
        django请求是将request作为参数,session是依附在request中,flask是导入request,session需要导入
    4. 路飞总共有几个项目
        - 管理后台
        - 导师后台
        - 主站
        
    5. 路飞主站业务
        - 课程
            - 课程列表
            - 课程详细
            - 大纲、导师、推荐课程
            - 价格策略
            - 章节和课时
            - 常见问题
        - 深科技
            - 文章列表
            - 文章详细
            - 收藏
            - 评论
            - 点赞
        - 支付
            - 购物车(4)
            - 结算中心(3)
            - 立即支付(1)
            知识点:
                - redis(为什么用redis?频繁的操作,频繁的状态,使用redis更适合)
                - 支付宝
                - 消息推送
                - 构建数据结构
                - 优惠券+贝里+支付宝

        - 个人中心
        - 课程中心
        
    6. 播放视频:CC视频
        - 加密
        - 非加密

1.flask的配置文件实现:
    app.config.from_objects('settings.DevelopmentConfig')
    - 给你一个路径 “settings.Foo”,可以找到类并获取去其中的大写的静态字段。
    1.settings.py
        class Config(object):
            DEBUG = False
            TESTING = False
            DATABASE_URL = ''
            SECRET_KEY = 'asdfghj'
        class ProductionConfig(Config):
            DATABASE_URL = ''
        class DevelopmentConfig(config):
            DEBUG = True
        class TestingConfig(Config):
            TESTING = True
    2.    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))
2.flask的路由系统
    endpoint 反向生成路由,不写默认会是函数名
    @app.route('/index/<int:nid>', endpoint='aaa')
    def index(nid):
        return '当前访问的url路径是:'+url_for('aaa', nid=nid)
    url_for('endpoint') / url_for('index',nid=888)
    动态路由:
        @app.route('/index/<int:nid>',methods=['GET','POST'])
        def index(nid):
            print(nid)
            return 'Index'
    marksafe markup
    有session需要在全局加SECRET_KEY = 'asdfghj'
3.请求相关的:
    request.method
    request.form
    request.args
    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.files
    obj = request.files['the_file_name']
    obj.save('/var/www/uploads/'+secure_filename(f.filename))
4.响应:
    响应体:
        return ''  return jsonify({'k1':'v1'})  return render_template('xxx.html')  return redirect()
    响应头:
        obj = make_response('asdfg')
        obj.headers['xxxxxxx'] = '123'
        obj.set_cookie('key', 'value')
        return obj
5.实现登录管理
        版本一:
            @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[0]
    传入函数:
        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
    模板的继承:
        模板: {% block content %} {% endblock %}
        继承: {% extends 'layout.html' %} {% block content %} {% endblock %}
    模板的引用include:
        {% include 'form.html' %}
    宏macro : {% macro ccc(name, type='text', value='') %}
                <h1>hong</h1>
                <input type='{{type}}' name='{{name}}' value='{{value}}'></input>
                7

                <input type='submit' value='提交'>
              {{ccc('n1')}}
              {{ccc('n2')}}  {% endmacro %}
7.flask的session:
    当请求到来时,flask读取cookie中的session对应的值,将该值解密并反序列化成字典,放入内存以便视图函数使用。
    视图函数:
        @app.route('/index')
        def index():
            session['k1'] = 123
            session['k2'] = 456
            del session['k1']
            return 'session'
    当请求结束时,flask会读取内存中字典的值,然后进行序列化+加密,写入到用户的cookie中。
8.闪现,在session中存储一个数据,读取时通过pop将数据移除,再次读取时为空。
    from flask import Flask, flash, get_flashed_messages
    @app.route('/page1')
    def page1():
        flash('临时数据的存储','error')
        flash('asdfn',error)
        flash('12346',info)
    @app.route('/page2')
    def page2():
        print(get_flashed_messages(category_filter=['error']))
        return 'session'
9.中间件:
    call方法什么时候执行?
        启动flask时不会执行call方法,当请求的时候才会执行
    如何做到在执行call方法之前,做一个操作,call方法之后做一个操作?
        class Middleware(object):
            def __init__(self,old):
                self.old = old
            def __call__(self, *args, **kwargs):
                print(2222222222222)
                ret = self.old(*args, **kwargs)
                print(3333333333333)
                return ret
        if __name__ == "__main__":
            app.wsgi_app = Middleware(app.wsgi_app)
            app.run()
10.特殊装饰器:类似于django的中间件
    1.before_request:
    2.after_request
    from flask import Flask
    app = Flask[__name__]
    @app.before_request
    def x1():
        print('before:x1')
        return 'xxxxx'
    @app.before_request
    def xx1():
        print('before:xx1')
    @app.after_request
    def x1(response):
        print('after:x1')
        return response
    @app.after_request
    def xx2(response):
        print('after:xx2')
        return response

  六个特殊的装饰器
    before_request after_request template_global template_filter before_first_request errorhandler

posted @ 2018-06-12 22:00  liang哥哥  阅读(108)  评论(0)    收藏  举报