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

原文地址:https://www.cnblogs.com/wt7018/p/11593236.html