• flask框架


    1.路由扩展

    2.模板

    3.请求与响应

    4.session

    5.闪现

    6.请求扩展

    7.中间件

    8.请求流程

    一.路由扩展

    1.

    # #对URL最后的 / 符号是否严格要求
    # strict_slashes=False,改参数是用来设置我们路由是否为严格模式,False是非严格模式,True是严格,默认就是严格
    # redirect_to="/login"比如说着个就url了,我们想让别人还输入旧的url登录到另一个网站
    from flask import Flask,redirect,render_template,jsonify,views
    app = Flask(__name__)
    
    @app.route('/index',strict_slashes=True,redirect_to="/login")
    def index():
        return "ok"
    
    @app.route('/login')
    def login():
        return "sb"
    
    @app.route('/detail/<int:nid>')
    def detail(nid):
        print(nid)
        return "ok"
    
    if __name__ == '__main__':
        app.run()

    2.

    # 添加到flask中
    # 我们要用自定义的路由,用正则的话
    #1导入from werkzeug.routing import BaseConverter
    # 2我先要写一个类,然后继承BaseConverter,然后实现__inti__, def to_python(self, value):to_url(self, value)
    # 3 app.url_map.converters['随便'] = RegexConverter
    #4 我们在路由里面@app.route('/index/<regex1("d+"):nid>'),regex1='随便,regex1("正则表达式")
    #5 regex1("正则表达式")匹配出来的结果,返回to_python,一定要return
    #6 当我们做反向解析的解析的时候,我们的参数,会传递给to_url,return的结果才是我们拼接到我们路由上
    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):
            """
            路由匹配时,匹配成功后传递给视图函数中参数的值
            """
            #value就正则匹配出来的结果
            print('value',value,type(value))
            # 这里可以操作打印的数据类型
            return "asdasdasd"
    
        def to_url(self, value):
            """
            使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
            """
            val = super(RegexConverter, self).to_url(value)
            print(val)
            return val
    
    app.url_map.converters['regex1'] = RegexConverter
    @app.route('/index/<regex1("d+"):nid>',endpoint="sb")
    def index(nid):
        print("nid",nid,type(nid))
                        # 可以在to_url里面改变这个参数
        print(url_for('sb', nid='888'))
        # /index/666
        return 'Index'
    
    if __name__ == '__main__':
        app.run()

    二.模板

    from flask import Flask,render_template,Markup
    app = Flask(__name__)
    app.debug = True
    app.secret_key = 'sdfsdfsdfsdf'
    
    USERS = {
        1:{'name':'张三','age':18,'gender':'','text':"道路千万条"},
        2:{'name':'李四','age':28,'gender':'','text':"安全第一条"},
        3:{'name':'王五','age':18,'gender':'','text':"行车不规范"},
    }
    # 函数在前端响应
    def func1(st,st1):
        return Markup(f"<h1>fzy-sb{st}{st1}</h1>")
    
    @app.route('/list',methods=['GET'])
    def list():
        info = USERS
        return render_template('list.html',info=info,html='<h1>fzy-dsb</h1>',html1=func1)
            # 有名分组 可以标识号
    @app.route('/detail<int:nid>',methods=['GET'],endpoint="sb")
    def detail(nid):
        return "ok"
    
    if __name__ == '__main__':
        app.run()

    三.请求与响应

     1 from flask import Flask
     2 from flask import request
     3 from flask import render_template
     4 from flask import make_response
     5 app = Flask(__name__)
     6 #请求里面有哪些内容
     7 #我们怎么定制响应
     8 @app.route('/login.html', methods=['GET', "POST"])
     9 def login():
    10     # 请求相关信息
    11     #提交的方法
    12     print(request.method)
    13     # request.args  get请求提及的数据
    14     print(request.args)
    15     # request.form   post请求提交的数据
    16     # request.values  post和get提交的数据总和
    17     # request.cookies  客户端所带的cookie
    18     # request.headers  请求头
    19     print(request.headers)
    20     # request.path     不带域名,请求路径
    21     print(request.path)
    22     # request.full_path  不带域名,带参数的请求路径
    23     # request.script_root
    24     # request.url           带域名带参数的请求路径
    25     # request.base_url      带域名请求路径
    26     # request.url_root      域名
    27     # request.host_url      域名
    28     # request.host          127.0.0.1:500
    29     # request.files
    30     # obj = request.files['the_file_name']
    31     # obj.save('/var/www/uploads/' + secure_filename(f.filename))
    32 
    33 
    34     # 响应相关信息
    35     # return "字符串"
    36     # return render_template('html模板路径',**{})
    37     # return redirect('/index.html')
    38     # return jsonify({'k1':'v1'})
    39 
    40     #response = make_response(render_template('index.html'))
    41     # response是flask.wrappers.Response类型
    42     # response.delete_cookie('key')
    43     # response.set_cookie('key', 'value')
    44     # response.headers['X-Something'] = 'A value'
    45     # return response
    46 
    47     # 如果想要做定制化响应的话
    48     #1导入make_response
    49     #2response=make_response(4剑客)
    50     #3 操作response
    51     # return response
    52     response=make_response(render_template('index.html'))
    53     response.set_cookie('jason', 'sb')
    54     # response.delete_cookie('key')
    55     response.headers['X-Something'] = 'A value sbwewewe'
    56     return response
    57 
    58 
    59 if __name__ == '__main__':
    60     app.run()
    View Code

    四.什么是session怎么使用

    '''                                                                                    
    app.session_interface这里面看                                                              
    存session,                                                                              
    1 调用save_session,将我们的session加密的val,读取配置文件['SESSION_COOKIE_NAME']得到key                  
    2 将1种的key,val存储到cookies                                                                
                                                                                           
    取session                                                                               
    1 获取request里面的cookies,获取里面key,这个key就是['SESSION_COOKIE_NAME'],值就是加密的值                   
    2 对该值进行解密                                                                              
    '''                                                                                    
    from flask import Flask,session                 
    app = Flask(__name__)                           
    # 使用session就需要指定一下这个参数,随便写一串字符串就是加密秘钥           
    app.secret_key = "qrqrqq"                       
    # 可以修改session的key                               
    app.config['SESSION_COOKIE_NAME'] = 'dsb'       
    @app.route('/')                                 
    def index():                                    
        # 设置session值                                
        session['fzy'] = "gdx"                      
        return "ok"                                 
                                                    
    @app.route('/index')                            
    def index1():                                   
        # 取session值                                 
        print(session['fzy'])                       
        return "ok1"                                
                                                    
    if __name__ == '__main__':                      
        app.run()                                   
                                                    

    五.闪现

    '''
    什么是闪现
    a产生信息,传给 c 页面以后,不是直接跳转到c,而是到b,或者是其他页面,
    但是用户访问c页面的时候,我希望把a给我的信息拿到
    '''
    一些参数的解释
    # flash是存   get_flashed_messages是取
    #1 如果要用flash就必须设置app.secret_key = 'asdfasdf'
    #2 只能取一次,在取就没有了
    #3 我们可以通过 flash('普通信息',category="info"),对信息做分类
    #4get_flashed_messages(with_categories=True,category_filter=("error",)),with_categories以键值对的形式获取
    #我们设置闪现,category_filter=("error",)进行分类信息的过滤
    # category= 对信息进行分类
    # 如果你不写这个with_categories=True取出来的值就没有key,就直接打印错误信息
    # category_filter=("error","info")指定取出哪些信息 等于说做了一个过滤
    # 在同一次请求中无论获取多少次都可以获取到
    # 但是请求结束后,再次请求就没有了,因为被pop掉了
    from flask import Flask,flash,get_flashed_messages,request
    
    app = Flask(__name__)
    app.secret_key = 'asdfasdf'
    
    @app.route('/index1')
    def index():
        #(category="message", message))
        flash('超时错误',category="error") # category= 对信息进行分类
        flash('普通信息',category="info")
        return "ssdsdsdfsd"
        # return redirect('/error')
    
    @app.route('/error1')
    def error1():
        return "ok"
    
    @app.route('/error')
    def error():                    # 如果你不写这个with_categories=True取出来的值就没有key,就直接打印错误信息
                                    # category_filter=("error","info")指定取出哪些信息 等于说做了一个过滤
        data = get_flashed_messages(with_categories=True,category_filter=("error","info"))
        # 在同一次请求中无论获取多少次都可以获取到
        # 但是请求结束后,再次请求就没有了,因为被pop掉了
        data1 = get_flashed_messages(with_categories=True, category_filter=("error", "info"))
        print("data1",data1)
        print("data",data)
        return "错误信息"
    
    if __name__ == '__main__':
        app.run()

    六.请求扩展

    重要的就2个:before_request,after_request

    from flask import Flask,flash,get_flashed_messages,request
    
    app = Flask(__name__)
    
    # # before_request请求之前的
    # @app.before_request
    # def befor1():
    #    print("我是请求之前1")
    #    return "123"
    #
    # @app.before_request
    # def befor2():
    #     print("我是请求之前2")
    
    # after_request 请求之后的 ,需要一个参数:response
    '''
    执行结果
    我是真的视图
    我是请求之后2
    我是请求之后1
    '''
    @app.after_request
    def after(response):
        print("我是请求之后1")
        return response
    
    @app.after_request
    def after(response):
        print("我是请求之后2")
        return response
    
    @app.route('/index')
    def index():
        print("我是真的视图")
        return "ok"
    
    if __name__ == '__main__':
        app.run()

    了解:

     1 只执行一次
     2 # @app.before_first_request
     3 # def before_first():
     4 #     print("123")
     5 
     6 #如论有没有异常都会执行,如果没有异常这个参数就是None,有就记录这个异常
     7 # @app.teardown_request
     8 # def tear(e):
     9 #     print('teardown_request')
    10 #     print(e)
    11 
    12 #捕获异常,如果出现异常,而且状态就是@app.errorhandler(404),
    13 @app.errorhandler(404)
    14 def error_404(arg):
    15     print(arg)
    16     return "404错误了"
    17 
    18 
    19 # @app.errorhandler(500)
    20 # def error(arg):
    21 #     print(arg)
    22 #     return "500错误了"
    23 
    24 
    25 
    26 
    27 @app.template_global()
    28 def sb(a1, a2):
    29     return a1 + a2
    30 
    31 @app.template_filter()
    32 def db(a1, a2, a3):
    33     print(a1,a2,a3)
    34     return a1 + a2 + a3
    35 
    36 @app.route('/index')
    37 def index():
    38     print("我是真的视图")
    39     return render_template("index.html")
    View Code

    七.中间件

    八.请求流程

  • 相关阅读:
    main函数的一些特性
    确保函数的操作不超出数组实参的边界
    今天学习了一点sed
    libevent 与事件驱动
    mvc3 action验证失败后的自定义处理
    使用spring.net+nibernate时如何用aspnet_regiis加密数据库连接字符串
    C# 中 IList IEnumable 转换成 List类型
    Nhibernate 过长的字符串报错 dehydration property
    小论接口(interface)和抽象类(abstract class)的区别
    C# 语言在函数参数列表中出现this关键词的作用
  • 原文地址:https://www.cnblogs.com/zahngyu/p/11846252.html
Copyright © 2020-2023  润新知