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

posted @ 2018-05-02 16:29  mihon  阅读(235)  评论(0编辑  收藏  举报