flask 配置文件 路由系统 模板语法 请求与相应

内容详细

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的方式
        # 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,
            '''

            # 方式一:相应头中,响应编码方式为 application/json
            return jsonify({'name':"lqz",'age':19})


            # 方式二
            # res = {'name': "lqz", 'age': 18}
            # import json
            # res=json.dumps(res)
            # return res
        if __name__ == '__main__':
            app.run()

2 flask 路由系统

2.1 路由本质


        # 你在什么地方用了装饰器,怎么用的---》登陆认证装饰器---》日志装饰器,只要执行这个函数就记录日志
        # django的路由 urls.py中---》flask中路由基于装饰器
        app.router()--->本质是self.add_url_rule,self就是flask对象app
        # 注册路由两种方式
            -装饰器
          -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, 
        '''

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

4 请求与相应

4.1 请求

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

4.2 响应

        #1 4件套
            # return "字符串"
            # return render_template('html模板路径',**{})
            # return redirect('/index.html')
            # return jsonify({'k1':'v1'})


            #1  响应头中加东西,四件套都可以使用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)
          4 你在视图函数中才能正常使用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)
                4 你在视图函数中才能正常使用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"])
posted @ 2022-05-22 23:08  风花雪月*  阅读(47)  评论(0编辑  收藏  举报