• flask配置文件、路由设置、模板语法、请求与响应、session使用、闪现功能(flash)


    今日内容概要

    • flask 配置文件
    • flask 路由系统
    • flask模板语法
    • 请求与相应
    • session
    • 闪现(flash翻译过来的)

    内容详细

    1、flask 配置文件

    # django ---》settings.py
    
    # flask --->支持很多方式
    # flask默认主要的一些配置(了解:是否是调试模式,秘钥,cookie的可以值,过期时间),自己的配置(mysql,redis。。)
    
    {
            'DEBUG':                                get_debug_flag(default=False),  是否开启Debug模式
            'TESTING':                              False,                          是否开启测试模式
            'PROPAGATE_EXCEPTIONS':                 None,                          
            'PRESERVE_CONTEXT_ON_EXCEPTION':        None,
            'SECRET_KEY':                           None,
            'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),
            'USE_X_SENDFILE':                       False,
            'LOGGER_NAME':                          None,
            'LOGGER_HANDLER_POLICY':               'always',
            'SERVER_NAME':                          None,
            'APPLICATION_ROOT':                     None,
            'SESSION_COOKIE_NAME':                  'session',
            'SESSION_COOKIE_DOMAIN':                None,
            'SESSION_COOKIE_PATH':                  None,
            'SESSION_COOKIE_HTTPONLY':              True,
            'SESSION_COOKIE_SECURE':                False,
            'SESSION_REFRESH_EACH_REQUEST':         True,
            'MAX_CONTENT_LENGTH':                   None,
            'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),
            'TRAP_BAD_REQUEST_ERRORS':              False,
            'TRAP_HTTP_EXCEPTIONS':                 False,
            'EXPLAIN_TEMPLATE_LOADING':             False,
            'PREFERRED_URL_SCHEME':                 'http',
            'JSON_AS_ASCII':                        True,
            'JSON_SORT_KEYS':                       True,
            'JSONIFY_PRETTYPRINT_REGULAR':          True,
            'JSONIFY_MIMETYPE':                     'application/json',
            'TEMPLATES_AUTO_RELOAD':                None,
        }
    
    
    # 使用方式
    	加载和使用配置
    
    from flask import Flask, jsonify
    
    app = Flask(__name__)
    
    ### 配置文件配置方式:
    # # 方式一:直接配置--->能够配的参数少
    app.secret_key = 'asdfasdf'
    app.debug = True  # 修改了代码,只需要保存,自动热加载
    
    
    # # 方式二:通过app.config字典,配置,这个字典中放了所有的配置
    # print('---', app.config)
    # app.debug = True
    # print(app.config)
    # app.config['DEBUG'] = False  # 都要大写
    # app.config['MYSQL_HOST'] = '127.0.0.1'
    
    # # 方式三:通过settings.py 配置文件--->用得少,django的方式 创建settings.py文件
    # app.config.from_pyfile("settings.py")
    # print(app.config)
    
    # # 方式四:多套配置文件:开发环境,测试环境,线上环境 ,配置有差别
    # app.config.from_object("settings.DevelopmentConfig")
    # app.config.from_object("settings.ProductionConfig")
    # print(app.config)
    
    # 方式五:服务(项目)多了,配置文件多了---》配置中心 nacos 阿波罗
    # m = {}
    # m = request.get('ssss')
    # app.config.from_mapping(m)
    
    @app.route('/')
    def index():
        # 面试题:你知道的http的请求头和响应头?
        '''
        referer,user-agent,content-type,cookie-->Connection: keep-alive,X-Forwarded-For
        http协议版本号:0.9版本,1.1 版本,2.0版本早就出了
        http基于socket---》应用层协议---》osi7层, 5层,tcp/ip 4层--》socket 抽象层--》网络和传输层
        三次握手四次挥手,每次发送http,都会三次握手四次挥手-->性能不高
        多次http请求共用一个socket连接
        2.0 多路复用  socket流式协议
        content-type,cookie,
        '''
        # 前端返回内容:
        # 方式 1 :相应头中,响应编码方式为 application/json
        return jsonify({'name': "lqz", 'age': 19})
    
        # 方式 2 :
        # res = {'name': "lqz", 'age': 18}
        # import json
        # res = json.dumps(res)
        # return res
    
    
    if __name__ == '__main__':
        app.run()
    

    settings.py:

    # 配置文件方式三
    # DEBUG=True
    # MYSQL_HOST='127.0.0.1'
    
    # 配置文件方式四
    class Config(object):
        DEBUG = False
        MYSQL_HOST = '127.0.0.1'
        MYSQL_POET = '3306'
    
    
    class ProductionConfig(Config):  # 上线阶段
        MYSQL_HOST = '184.124.22.12'
        MYSQL_POET = '3306'
    
    
    class DevelopmentConfig(Config):  # 测试阶段
        DEBUG = True
    
    
    class TestingConfig(Config):
        TESTING = True
    

    2、flask 路由系统

    2.1 路由本质

    # 你在什么地方用了装饰器,怎么用的---》登陆认证装饰器---》日志装饰器,只要执行这个函数就记录日志
    
    # django的路由 urls.py中---》flask中路由基于装饰器
    
    # 注册路由两种方式
    	1 装饰器
        
    	2 app.add_url_rule('/',view_func=index)  
    

    2.2 cbv写法

    # cbv
    # 如果继承的是View,需要重写dispatch
    # 如果继承的是MethodView,只需要写get,post。。方法即可
    class HomeView(MethodView):
        def get(self):
            print(request.path)
            return 'cbv的homeview'
    
    
    # 添加路由
    # name 是路由别名,跟endpoint一个作用,但是cbv必须传name
    app.add_url_rule('/home', view_func=HomeView.as_view(name='home'))
    

    2.3 路由的参数

    # app.add_url_rule的参数
    '''
    1 rule, URL规则,  可以使用转换器 <int:pk>
    
    2 endpoint, 当前路由的别名,如果不传, 默认已函数名作为endpoint,如果函数名重名,就会有两个重名的地址,报错,主要用来反向解析
    # endpoint = None, 名称,用于反向生成URL,即: url_for('名称')
    # 多个视图函数,如果加同一个装饰器,如果不写endpoint,就会报错 
     
    3 view_func, 视图函数名称 如果是cbv  视图类.as_view(name='xx')
    
    4 defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}
    为函数提供参数,就是django中的kwargs
    
    5 methods = None, 允许的请求方式,如:["GET", "POST"]
    
    6 strict_slashes = None
    对URL最后的 / 符号是否严格要求
    
    7 redirect_to = None,   redirect_to='/home'
    #重定向到指定地址
    
    8 子域名访问
    subdomain = None, 
    '''
    

    image

    3、flask模板语法

    # 原来dtl中学的,拿过来,无缝衔接---》flask的模板语法支持 (),[] 等
    
    # 渲染变量 ---》比dtl多支持允许 () []
    
    # for循环一样
    # if判断,一样
    
    # Markup等价django的mark_safe ,
    
    # extends, include一模一样
    
    from flask import Flask, render_template, Markup
    
    from flask.views import View, MethodView
    
    app = Flask(__name__)
    
    app.secret_key = 'asdfasdf'
    app.debug = True
    
    
    def test(a, b):
        return a + b
    
    
    def func1(arg):  # Jinja处理了xss攻击,让字符串显示成标签的样子。Markup
        return Markup("<input type='text' value='%s' />" % (arg,))
    
    
    @app.route('/')
    def index():
        return render_template('index.html', name='lqz', test=test, safe=func1)
    
    
    if __name__ == '__main__':
        app.run()
    

    templates/index.html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    
    <body>
    <p>{{name}}</p>
    <p>{{test(5,6)}}</p>
    <p>{{safe('lqz')}}</p>
    </body>
    </html>
    

    image

    4、请求与相应

    4.1 请求

    @app.route('/request', methods=['GET', "POST"])
    def test_request():
        # http请求中有的东西,都能取出来
        print(request.method)
        # request.method  提交的方法
    
        # request.args  get请求提及的数据
        print(request.args)
    
        # request.form   post请求提交的数据
        print(request.form)
    
        # request.values  post和get提交的数据总和
        print(request.values)
    
        # request.cookies  客户端所带的cookie
        print(request.cookies)
    
        # request.headers  请求头
        print(request.headers)
    
        # request.path     不带域名,请求路径
        print(request.path)
    
        # request.full_path  不带域名,带参数的请求路径
        print(request.full_path)
    
        # request.url           带域名带参数的请求路径
        print(request.url)
    
        # request.base_url		带域名请求路径
        # request.url_root      域名
        # request.host_url		域名
        # request.host			127.0.0.1:500
        print(request.host)
        # request.files
        # obj = request.files['the_file_name']
        # obj.save('/var/www/uploads/' + secure_filename(f.filename))
    
        # 响应相关信息
        # return "字符串"
        # return render_template('html模板路径',**{})
        # return redirect('/index.html')
        # return jsonify({'k1':'v1'})
    
        # 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
        return "内容"
    

    4.2 响应

    @app.route('/test_response')
    def test_response():
        # 1、 4件套
        # return "字符串"
        # return render_template('html模板路径',**{})
        # return redirect('/index.html')
        # return jsonify({'k1':'v1'})
    
        # 响应头中加东西,四件套都可以使用make_response包裹成响应对象,等同于django中的HTTPResponse
        # res=make_response('字符串')
        # res.headers['name']='lqz'
        # return res
    
        # 2、 设置cookie
        response = make_response('字符串')
        response.set_cookie('key', 'value')
        return response
    

    5、session

    # cookie  session token
    
    # session是存在于服务端的键值对---》django中的session默认存在数据库的django_session表
    	request.SESSION['name']='lqz'
        
    ### 在django中发什么三件事--->响应走,在中间件的process_response中写的
    	1. 生成一个随机的字符串   sdfads 
    	2. 往数据库存表  
    		id	key	content	expire
    		1	sdfads	数据内容(加密)	过期时间 
            
    	3. 写入cookie返回浏览器
    		response.set_cookie('sessionid',sdfads)
            
    	# 请求来了---》process_request中执行了
    	1. 根据sessionid取出随机字符串
    	2. 根据随机字符串去数据库查出content数据,解密
    	3. 赋值个请求对象request.SESSION
    	4. 你在视图函数中才能正常使用request.SESSION['name']取值,赋值,删除值
        
       
    
    ### 任何web框讲的session原理都是这个
    ### flask中使用session
    	设置值:session['login']=True
    	取值:session['login']
    
    	# flask中session原理
    	#flask流程,写入session流程
    	1 把sesion对象,当字典 转成字符串,使用秘钥加密 
    		val = self.get_signing_serializer(app).dumps(dict(session))
    	2 写入cookie返回浏览器 session=加密的字符串
    	response.set_cookie(
    		app.session_cookie_name,
    		val, # 加密字符串 
    	)
        
    	# 请求来了流程
    	1 根据sessionid取出加密字符串
    		val = request.cookies.get(app.session_cookie_name)
    	2 通过秘钥解密,组装成 session
    		data = s.loads(val, max_age=max_age)
    		self.session_class(data)
    	3 你在视图函数中才能正常使用session['name']取值,赋值,删除值
      
      
    	# 源码分析
    	处理session,有个一个类SecureCookieSessionInterface(),有俩重要方法 
    	open_session:请求来了执行
    		1 根据sessionid取出加密字符串
    			val = request.cookies.get(app.session_cookie_name)
    		2 通过秘钥解密,组装成 session
    			data = s.loads(val, max_age=max_age)
    			self.session_class(data)
    		3 你在视图函数中才能正常使用session['name']取值,赋值,删除值
          
    	save_session:请求走了执行
    		1 把sesion对象,当字典 转成字符串,使用秘钥加密 
    			val = self.get_signing_serializer(app).dumps(dict(session))
    		2 写入cookie返回浏览器 session=加密的字符串
    		response.set_cookie(
    			app.session_cookie_name,
    			val, # 加密字符串 
    		)
        
     # 自定义一个类 SecureCookieSessionInterface,重写open_session和save_session,把session存到数据库,redis里----》flask-session 模块做的:数据库,redis,文件中
    

    6、闪现(flash翻译过来的)

    # 在多次请求中,第一次请求放一个值,第二次请求取出这个值,取完就没有了
    
    # django中有吗?  
    	有 没有学---》消息框架,message ,django默认自带的app,message的app
    
    # 实际用途
    	a页面出了错,重定向到b页面,b页面要把错误信息显示
      
    # 本质:
    	如果在同一次请求中,放到request对象中即可
    	如果在不同请求中,放到session中,所以使用闪现一定配置秘钥
    
    # 使用
    设置:flash('诱惑美女')
    获取:res=get_flashed_messages()
    
    # 高级使用  按分类设置和获取
    设置:
    	flash('诱惑美女',category='man')
    	flash('诱惑帅哥',category='wonmen')
    获取:
    	res = get_flashed_messages(with_categories=True,category_filter=["man"])
    
    from flask import Flask, flash, get_flashed_messages
    
    app = Flask(__name__)
    app.debug = True
    app.secret_key = 'adsfasfasd'
    
    
    # http://127.0.0.1:5000/set_flash
    @app.route('/set_flash')
    def set_flash():
        flash('诱惑美女')
        return "设置成功"
    
    
    # http://127.0.0.1:5000/get_flash
    @app.route('/get_flash')
    def get_flash():
        res = get_flashed_messages()
        print(res)
        return "获取成功"
    
    
    if __name__ == '__main__':
        app.run()
    

    image

  • 相关阅读:
    PLONK 的工作原理:第 1 部分
    编译原理:语法分析(自顶向下)
    一文2000字从0到1用Jmeter全流程性能测试实战
    MS4344:24bit、192kHz 双通道数模转换电路
    pandas是什么以及pandas的三种数据结构Series、DataFrame、MultiIndex的创建方式函数代码
    flask框架初学-07-数据库映射关系
    HDLbits exercises 5 (BASIC GATES节选题)
    10 种保证接口数据安全的方案!
    计算机毕设(附源码)JAVA-SSM基于的社区疫情管理系统
    Clion配置远程服务器并在上面开发
  • 原文地址:https://www.cnblogs.com/jgx0/p/16270063.html