一、配置文件
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