zoukankan      html  css  js  c++  java
  • Flask

    一、配置文件

    1、实现原理(importlib)

    settings.py

    class Foo:
        DEBUG = True
        TEST = True

    test.py

    import importlib
    
    
    path = 'settings.Foo'
    p, c = path.rsplit('.', 1)
    p = importlib.import_module(p)
    cls = getattr(p, c)
    # print(cls)  # <class 'settings.Foo'>
    for i in dir(cls):
        if i.isupper():
            print(i, getattr(cls, i))   
    """
    DEBUG True
    TEST True
    """

    2、使用自定义的配置文件

    settings.py

    class Config:
        DEBUG = False
        TESTING = False
        DATABASE_URI = 'sqlite://:memory:'
    
    
    class Pro(Config):
        DATABASE_URI = 'mysql://user@localhost/foo'
    
    
    class Dev(Config):
        DEBUG = True
    
    
    class Test(Config):
        TESTING = True

    引用

    app.config.from_object('settings.Foo')

    3、注意

    在配置文件中自定义的静态属性,要想有效果必须大写(与Django一样)

    二、路由

    通过装饰器进行路由,设置url和视图函数的对应关系

    1、url

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

    2、请求方式

    默认的请求方式是:GET

    @app.route('/index', methods=['GET', 'POST'])
    def index():
    
        return "Hello"

    3、反向解析(endpoint===>name  url_for===>reverse)

    a、不含参数

    from flask import Flask, url_for
    
    app = Flask(__name__)
    
    app.config.from_object('settings.Foo')
    
    
    @app.route('/index', methods=['GET', 'POST'], endpoint='abc')
    def index():
        print(url_for('abc'))   # /index
        return "Hello"
    
    
    if __name__ == '__main__':
        app.run()

    b、含参的路由

    endpoint默认值是函数名

    from flask import Flask, url_for
    
    app = Flask(__name__)
    
    app.config.from_object('settings.Foo')
    
    
    @app.route('/index/<int:pk>/', methods=['GET', 'POST'], endpoint='abc')
    def index(pk):
        print(pk, type(pk))     # 1 <class 'int'>
        print(url_for('abc', pk=pk))   # /index/1/
        return "Hello"
    
    
    if __name__ == '__main__':
        app.run()

    注意:Flask和Django的路由几乎一致

    Django中使用代参数的路由通过元祖, pk = (pk, )

    Flask可以直接使用 pk =pk

    三、请求相关

    # 请求相关信息
    # request.method  ***** 
    # request.args    ***** url中的数据
    # request.form    ***** from表单提交的数据
    # 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))

    四、相应相关的数据

    a、常用

    Flask                        Django
        
    字符串                        HTTPResponse    
    redirect                     redirect
    render_template              render
    jsonify                      JsonResponse    

    注意:render,Flask传递参数       **{} 或 key = value

             Django传递参数  {}

    b、自定义响应头

    def index(pk):
        obj = make_response('Hello')
        obj.headers['xx'] = 'oo'
        return obj

    五·、模板渲染(自认为比Django好,更贴近python语法)

    a、基本数据类型:可以执行python语法,如:dict.get()

    b、传入函数

      - Flask   不会自动执行

      - Django  自动执行

    c、全局函数,可以在模板中直接使用, 不需要通过render传输

    视图====》注意:装饰器要加括号

    @app.template_global()
    def foo(a, b):
        return a + b

    模板使用

    {{foo(1,5)}}

    视图

    @app.template_filter()
    def foo(a, b, c):
        return a + b + c

    模板,注意模板的使用,踩过坑

    <p>{{2|foo(1,4)}}</p>

    六、模板继承和组件

    与Django一样,不在说明

    注意:后端的Markup让模板通过标签

    七、session

    app.secret_key = '123'

    在请求开始时,从cookie中拿到session值,进行解密反序列化

    单请求结束后,将session进行加密,序列化存在cookie

    八、flash

    在session中存储数据,读取时通过pop移除该数据

    @app.route('/test1/')
    def test1():
        flash('临时信息', 'info')
        return "Hello"
    
    
    @app.route('/test2/')
    def test2():
        ret = get_flashed_messages('info')
        print(ret)
        return 'world'

    注意:使用flash是,用使用

    app.secret_key = '123'

    九、中间件

    和Django中间件不一样,几乎不用

     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()

    十、特殊装饰器(全局)

    1. before_request

    与Django中间件 相似 process_request

    应用场景:验证是否为登录用户,大量url需要用户登录是比使用装饰器方法
    2. after_request

    与Django中间件 相似 process_response

    区别:

    函数加载顺序

    b1 b2 a1 a2

    b1   b2

    a1   a2

    如果b1,return a2还是会执行(听说和Django比较早的版本一致)

    4. template_global() 两个参数
    5. template_filter()  三个参数  注意在模板的使用格式

    6. errorhandler(状态码)

    @app.errorhandler(404)
    def not_found(arg):
        print(arg)
        return "没找到"

     注意:404是状态码,一定要添加arg

  • 相关阅读:
    Android SDK在线更新镜像服务器
    redis
    自动
    Java编程时部分快捷键
    问题解决路
    35
    【JavaScript 8—基础知识点】:DOM
    【JavaScript 7—基础知识点】:BOM
    【JavaScript 6—基础知识点】:正则表达式(应用)
    【JavaScript 5—基础知识点】:正则表达式(笔记)
  • 原文地址:https://www.cnblogs.com/wt7018/p/11593236.html
Copyright © 2011-2022 走看看