当前位置:网站首页>Flask framework in-depth
Flask framework in-depth
2022-08-02 14:20:00 【Spaghetti Mixed with No. 42 Concrete】
FlaskFramework in depth one
1、The order in which functions plus decorators are executed
# flaskThe routes are based on decorators----》Add a decorator to the view function---》Add the execution order of multiple decorators---》登
# Record the authentication decorator---》加载router下,Do route matching first,The match is executed successfullyauthThe wrapped view function
2、路由系统
@app.router('/',menthods=['GET','POST']) ==> app.add_url_rule(rule='/',endpoint='index',view_func=index,methods=['GET'])
# flask的路由是基于装饰器的---》But its essence isapp.add_url_rule方法--->类似于django 的path(url)
1、路由系统本质
""" # route的源代码 1. decorator = app.route('/',methods=['GET','POST'],endpoint='n1') def route(self, rule, **options): def decorator(f): endpoint = options.pop('endpoint', None) self.add_url_rule(rule, endpoint, f, **options) return f return decorator 2. @decorator decorator(index)----》本质---》self.add_url_rule(rule, endpoint, f, **options) 3 The essence of routing can be written as app.add_url_rule(rule='/',endpoint='index',view_func=index,methods=['GET']) 4 (了解)endpoint如果不传,是None,There is also a default value---》函数的名字 -If a decorator is used,一定要指定endpoint """
2、转换器
app.add_url_rule(rule='/index/<string:name>',endpoint='index',view_func=index,methods=['GET'])
# 跟django 2.xthe same as the latter converter
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
3、app.add_url_rule参数
@app.route和app.add_url_rule参数:
#1 rule, URL规则
#2 view_func, 视图函数内存地址
#3 defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'} 为函数提供参数
#4 endpoint = None, 名称,用于反向生成URL,即: url_for('名称')
#5 methods = None, 允许的请求方式,如:["GET", "POST"]
#6 对URL最后的 / 符号是否严格要求
strict_slashes = None
''' @app.route('/index', strict_slashes=False) #访问http://www.xx.com/index/ 或http://www.xx.com/index均可 @app.route('/index', strict_slashes=True) #仅访问http://www.xx.com/index '''
#7 重定向到指定地址
redirect_to = None,
''' @app.route('/index/<int:nid>', redirect_to='/home/<nid>') '''
4、支持正则(不用)
#1 写类,继承BaseConverter
#2 注册:app.url_map.converters['regex'] = RegexConverter
# 3 使用:@app.route('/index/<regex("\d+"):nid>') 正则表达式会当作第二个参数传递到类中
from flask import Flask, views, url_for
from werkzeug.routing import BaseConverter
app = Flask(import_name=__name__)
class RegexConverter(BaseConverter):
""" 自定义URL匹配正则表达式 """
def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex
def to_python(self, value):
""" 路由匹配时,匹配成功后传递给视图函数中参数的值 """
return int(value)
def to_url(self, value):
""" 使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数 """
val = super(RegexConverter, self).to_url(value)
return val
# 添加到flask中
app.url_map.converters['regex'] = RegexConverter
@app.route('/index/<regex("\d+"):nid>')
def index(nid):
print(url_for('index', nid='888'))
return 'Index'
if __name__ == '__main__':
app.run()
5、CBV源码分析(跟djagno没有区别)
from flask import Flask, url_for
from flask.views import View, MethodView
app = Flask(__name__)
app.debug = True # 热更新---->不停机更新
@app.route(rule='/', methods=['GET'], endpoint='index')
def index():
return 'hello flask'
# 1 写一个类,继承MethodView
class LoginView(MethodView):
def get(self):
return 'get --login'
def post(self):
return 'post---login'
# 2 配置路由,LoginView.as_view()But it must take one parameter,The parameter is an alias for this address
app.add_url_rule('/login', view_func=LoginView.as_view('login'))
# add_url_rule--->等同于django的pathpaht('/',index,name='index')
if __name__ == '__main__':
app.run()
3、模板语法
# 完全兼容DTL,比DTL强大一些,可直接执行函数,还可以传参数
#1.Markup等价django的mark_safe ,
# 2.extends,include一模一样
4、请求与响应
# request对象属性和方法
# request.method 提交的方法
# request.args get请求提及的数据
# request.form post请求提交的数据
# request.values post和get提交的数据总和(一般不用)
# request.cookies 客户端所带的cookie
# request.headers 请求头
# request.path 不带域名,请求路径 http://127.0.0.1:5000/test_if?name=lqz&age=10----》/test_if
# request.full_path 不带域名,带参数的请求路径--->/test_if?name=lqz&age=10
# request.url 带域名带参数的请求路径-->most complete path
# request.base_url 带域名请求路径
# request.url_root 域名
# request.host_url 域名
# request.host 127.0.0.1:500
# request.files # Client upload problem
# obj = request.files['the_file_name']
# response对象
######新手四件套
# return "字符串"
# return render_template('html模板路径',**{})
# return redirect('/index.html')
# return jsonify({'k1':'v1'})
# 向cookie中写值
# response = make_response(render_template('index.html'))
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# return response
5、session
# 通过全局的session
-设置值:session['key']=value
-取值:session['key']
-删除值:del session['key']
-Don't care about different users,Unified use globalsession取,不会乱
# Part of the source code interpretation(等同于django中的中间件django.contrib.sessions.middleware.SessionMiddleware)
-这样设置session['key']=value---》Put this data when the request goes,加密,放到cookiegiven the front end
-前端带着cookie再一次请求---》请求来的时候,Reverse the data,再放到session中,这样你才能使用session['key']
-SecureCookieSessionInterface---》Responsible for the above two things
--save_session:走的时候
--open_session:带着cookie来的时候
6、闪现
# flash 翻译过来的,flash函数
# 作用: Put some data somewhere,下次要用的时候,直接取出来,Take it once and it's gone,The next request will be gone---》可以跨请求
# 放
flash('A lump of poop')
# Classify
flash('一个包子',category='bz')
flash('a poop',category='db')
flash('Another poop',category='db')
# 取
res = get_flashed_messages()
#Classification take
res = get_flashed_messages(category_filter=['db'])
# 应用场景:There is some data in the last request,It needs to be brought to the next request,You can use flash
# 其实是放在session中等同于 session[ss]='sdsd'
# django也有类似的东西----》message这个app,就是它
7、请求扩展
# 类似于django的中间件,before the request comes,and execute some method after walking
1、before_request
类比django中间件中的process_request,在请求收到之前绑定一个函数做一些事情
#基于它做用户登录认证
@app.before_request
def process_request(*args,**kwargs):
if request.path == '/login':
return None
user = session.get('user_info')
if user:
return None
return redirect('/login')
2、after_request
类比django中间件中的process_response,每一个请求之后绑定一个函数,如果请求没有异常
@app.after_request
def process_response1(response):
print('process_response1 走了')
return response
3、before_first_request
第一次请求时,跟浏览器无关
@app.before_first_request
def first():
pass
4、teardown_request
每一个请求之后绑定一个函数,即使遇到了异常
@app.teardown_request
def ter(e):
pass
5、errorhandler
路径不存在时404,服务器内部错误500
@app.errorhandler(404)
def error_404(arg):
return "404错误了"
6、template_global
标签
@app.template_global()
def sb(a1, a2):
return a1 + a2
#{
{sb(1,2)}}
7、template_filter
过滤器
@app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3
#{
{ 1|db(2,3)}}
总结:
1 重点掌握before_request和after_request,
2 注意有多个的情况,执行顺序
3 before_request请求拦截后(也就是有return值),response所有都执行
8、蓝图
# blueprint翻译过来的---》蓝图---》划分目录
# Do not use blueprints to divide directories,也可以,But circular imports occur
# Using blueprints can be avoided
# 使用蓝图:
1 创建蓝图对象blog = Blueprint('blog', __name__),You can use your own static files and template
2 Later routes are registered using the blueprint object
3 Put all blueprints inapp中注册一下,可以指定前缀
app.register_blueprint(blog)
边栏推荐
- 期货具体是如何开户的?
- 第五单元 保持状态
- 配置zabbix自动发现和自动注册。
- 8581 线性链表逆置
- Deep learning framework pytorch rapid development and actual combat chapter3
- 政策利空对行情没有长期影响,牛市仍将继续 2021-05-19
- Some impressions of the 519 plummet 2021-05-21
- About the development forecast of the market outlook?2021-05-23
- Flask上下文,蓝图和Flask-RESTful
- Sentinel源码(二)入口方法分析
猜你喜欢
随机推荐
AWVS工具介绍[通俗易懂]
How to solve mysql service cannot start 1069
window10下半自动标注
deal!It's July 30th!
[ROS](05)ROS通信 —— 节点,Nodes & Master
此次519暴跌的几点感触 2021-05-21
Chapter6 visualization (don't want to see the version)
8581 Linear linked list inversion
第十五单元 分页、过滤
第六单元 初识ORM
[ROS](06)ROS通信 —— 话题(Topic)通信
[ROS]roscd和cd的区别
Minio文件上传
如何自定义feign方法级别的超时时间
Haystack的介绍和使用
Unit 5 Hold Status
logback源码阅读(一)获取ILoggerFactory、Logger
云片网案例
使用云GPU+pycharm训练模型实现后台跑程序、自动保存训练结果、服务器自动关机
Mysql's case the when you how to use