• Falsk


    flask:

    1.配置文件的几种方式:

        1.app.config['DEBUG'] =True

        2.app.config.from_pyfile("setting.py")

        3.app.config.from_envvar("环境变量名称") #环境变量值为Python文件名称,因为内部会调用from_pyfile

        4.app.config.from_json("json文件名")#内部会执行json.loads

        5.app.config.from_mapping({"DEBUG":True}) #字典格式

        6.app.config.from_object("pro_flask.setting.Config")

            setting

                class Config(object):

                    DEBUG = False

    2.视图

        fbv的两种方式:

            1.app = Flask(__name__)

                @app.route('/index')

                def index():

                    return "Index"

                 if __name__ == '__main__':

                    app.run()

             2.def index():

                return "Index"

               app.add_url_rule("/index","student",index) #student是别名

        cbv:

            class IndexView(view.ModeView):

                method = ['GET']

                decorators = [auth, ]

               

                def dispath_request(self):

                    return 'Index'

                   

                def get(self,*args,**kwargs):

                    url = url_for('index', nid=nid)  #反向生成url

                    return redirect(url)

            app.add_url_rule('index',view_func=IndexView.as_view(name='index')) #name=endpoint

           

        另外:装饰器必须紧贴着函数,在路由的装饰器之下。

    3.路由参数:

        view_func  视图函数名称

        defaults=None   当URL中无参数,函数需要参数时,使用defaule的默认值

        endpoint=None   用于反向生成URL ,url_for('index')

        strict_slashes=None 对URL最后 / 符号是否严格要求

        redirect_to=None 重定向到指定地址 @app.route('/index/<int:nid>', redirect_to='/home/<nid>') 注意重定向的url也需要参数,但是不需要类型

        subdomian=None  子域名访问 @app.route("/", subdomain="admin")

    4.模板:

       1.@app.template_global()

        def sb(a1,a2):

            return a1 + a2 + 100

         #{{sb(1,2)}}

       2.@app.template_filter()

        def db(a1, a2, a3):

            return a1 + a2 + a3

         #{{1|db(2,3)}}

       

       3.{% macro xxxx(name, type='text', value='') %}

            <input type="{{ type }}" name="{{ name }}" value="{{ value }}">

            <input type="{{ type }}" name="{{ name }}" value="{{ value }}">

            <input type="{{ type }}" name="{{ name }}" value="{{ value }}">

            <input type="{{ type }}" name="{{ name }}" value="{{ value }}">

        {% endmacro %}

        {{ xxxx('n1') }}

       

        4.{{xss|safe}} Markup()

       

    5.请求和响应:

         # 请求相关信息

            # request.method

            # request.args    #=request.GET 字典格式

            # request.querystring #=request.GET bytes格式

            # request.form    #=request.POST

            # request.values  #=request.body

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

            # 响应相关信息

            # return "字符串"

            # return render_template('html模板路径',**{})

            # return redirect('/index.html')

            # return jsonify(name='alex',age='18')  #相当于JsonResponse

            # 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

           

           

    6.Session:

        它是在cookie的基础上实现的,并且对cookie进行密钥签名要使用session需要设置一个密钥

        app.secret_key = 'ASDFACASD241SDD/DDD'

        session['username'] = 'xxx' 设置session

        session.pop['username']  删除session

        flask 默认的session 是存在浏览器上,并且是加密的,减轻服务器的压力

       

    7.闪现flash:

        flash是基于session来实现的,使用一次后就被pop删除

        app.secret_key = '123154sdfsdc' #创建封装cookie密码

        flash("build ok") #设置flash值

        v=get_flashed_messages() #获取flash的值

    8.请求扩展:

        @app.before_request   #请求之前

        @app.befor_first_request #第一次请求之前

        @app.after_request #请求之后

        @app.before_response #响应之前

        @app.after_response #响应之后

    9.蓝图:Blueprint

        实现多文件目录结构,每个文件夹可以有自己的视图,模板,静态文件,并且可以避免相互导入的问题

        每一个文件夹可以设置路由的前缀,实现多app的功能,每个APP里面的请求扩展不会相互间影响。

       

    10.信号:

        Flask的信号基于blinker  pip3 install blinker

        request_started = _signals.signal('request-started')                # 请求到来前执行

        request_finished = _signals.signal('request-finished')              # 请求结束后执行

        before_render_template = _signals.signal('before-render-template')  # 模板渲染前执行

        template_rendered = _signals.signal('template-rendered')            # 模板渲染后执行

        

        got_request_exception = _signals.signal('got-request-exception')    # 请求执行出现异常时执行

        

        request_tearing_down = _signals.signal('request-tearing-down')      # 请求执行完毕后自动执行(无论成功与否)

        appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 请求上下文执行完毕后自动执行(无论成功与否)

        

        appcontext_pushed = _signals.signal('appcontext-pushed')            # 请求上下文push时执行

        appcontext_popped = _signals.signal('appcontext-popped')            # 请求上下文pop时执行

        message_flashed = _signals.signal('message-flashed')                # 调用flask在其中添加数据时,自动触发

       

        eg:

        rom flask import Flask, current_app, flash, render_template

        from flask.signals import _signals

        app = Flask(import_name=__name__)

        # 自定义信号

        xxxxx = _signals.signal('xxxxx')

        def func(sender, *args, **kwargs):

            print(sender)

        # 自定义信号中注册函数

        xxxxx.connect(func)

        @app.route("/x")

        def index():

            # 触发信号

            xxxxx.send('123123', k1='v1')

            return 'Index'

        if __name__ == '__main__':

            app.run()

           

        自定义URL匹配正则表达式:

            from flask import Flask,url_for

            app = Flask(__name__)

            # 定义转换的类

            from werkzeug.routing import BaseConverter

            class RegexConverter(BaseConverter):

                """

                自定义URL匹配正则表达式

                """

                def __init__(self, map, regex):

                    super(RegexConverter, self).__init__(map)

                    self.regex = regex

                def to_python(self, value):

                    """

                    路由匹配时,匹配成功后传递给视图函数中参数的值

                    :param value:

                    :return:

                    """

                    return int(value)

                def to_url(self, value):

                    """

                    使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数

                    :param value:

                    :return:

                    """

                    val = super(RegexConverter, self).to_url(value)

                    return val

            # 添加到converts中

            app.url_map.converters['regex'] = RegexConverter

            # 进行使用

            @app.route('/index/<regex("d+"):nid>',endpoint='xx')

            def index(nid):

                url_for('xx',nid=123)  #反向生成,就会去执行to_url方法

                return "Index"

            if __name__ == '__main__':

                app.run()

       

        上下文:

            分析见PDF

       

        Session:

            flask Session默认的设置是将用户信息通过app.secret_key = 'xxxx'加密后,变成字符串返回给用户

            当用户信息过多时,cookie的长度有限,并且不安全,如果需要将用户信息保存在数据库或者缓存中,引入session的插件

            flask_session:

        保存到redis: pip3 install flask-session

            import redis

            from flask import Flask, session

            from flask_session import Session

           

            app = Flask(__name__)

            app.debug = True

            app.secret_key = 'xxxx'

           

            app.config['SESSION_TYPE'] = 'redis'  # session类型为redis

            app.config['SESSION_PERMANENT'] = False  # 如果设置为True,则关闭浏览器session就失效。

            app.config['SESSION_USE_SIGNER'] = False  # 是否对发送到浏览器上session的cookie值进行加密

            app.config['SESSION_KEY_PREFIX'] = 'session:'  # 保存到session中的值的前缀

            app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port='6379', password='123123')  # 用于连接redis的配置

            Session(app)

            @app.route('/index')

            def index():

                session['k1'] = 'v1'

                return 'xx'

            if __name__ == '__main__':

                app.run()

  • 相关阅读:
    关于基于.net的WEB程序开发所需要的一些技术归纳
    技术的学习方法探索之一
    生活,就是让程序为人们服务!
    js滑动提示效果
    radio判断是否为空
    JS清除网页历史记录,屏蔽后退按钮
    多表查询存储过程
    IP地址转化为数字,charindex ,SUBSTRING
    c# byte转化为string
    获得IP地址中文
  • 原文地址:https://www.cnblogs.com/mihon/p/8980980.html
Copyright © 2020-2023  润新知