zoukankan      html  css  js  c++  java
  • Flask的使用

    一、路由系统

    1.子域名的配置

    """
    可传入的参数:
    @app.route('/user/<username>')
                @app.route('/post/<int:post_id>',methods=['GET',"POST"],endpoint='fff')
    
    - subdomain(配置子域名的方法)
                www.baidu.com,
                    - 现在本地hosts文件中找IP  C:WindowsSystem32driversetc     /etc/hosts
                    
                from flask import Flask,render_template,request,redirect,session,url_for
    
                app = Flask(__name__)
                app.config['SERVER_NAME'] = 'bjg.com:5000'
            
                @app.route("/index",subdomain='<xxxxx>')
                def index(xxxxx):
                    return "%s.bjg.com" %(xxxxx,)
    
                if __name__ == '__main__':
                    app.run()
    """
    #py
    from flask import Flask,render_template,request,redirect,session,url_for

    app = Flask(__name__)
    app.config['SERVER_NAME'] = 'bjg.com:5000'
    @app.route('/index/<int:nid>',methods=['GET',"POST"],endpoint='fff',defaults={'cid':777},strict_slashes=False)
    def index(nid,cid):
    print(nid,cid)
    # v = url_for('fff',nid=888)
    # print(v)
    return "xxxx"

    @app.route('/old',redirect_to='/new')
    def old():
    return "Old"

    # /new
    @app.route('/new')
    def new():
    return 'New'

    admin.bjg.com:5000/index
    @app.route("/index", subdomain="admin")
    def admin_index():
    return "admin.bjg.com"

    @app.route("/index",subdomain='www')
    def index():
    return "www.bjg.com"

    @app.route("/index",subdomain='<xxxxx>')
    def index(xxxxx):
    return "%s.bjg.com" %(xxxxx,)

    if __name__ == '__main__':
    app.run()
     

    2.支持正则表达式

    '''
            - 扩展Flask的路由系统,让他支持正则
                    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['xxx'] = RegexConverter
    
                    # 进行使用
                    @app.route('/index/<xxx("d+"):nid>',endpoint='xx')
                    def index(nid):
                        url_for('xx',nid=123)
                        return "Index"
    
                    if __name__ == '__main__':
                        app.run()
    '''
    #py
    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['xxx'] = RegexConverter

    # 进行使用
    @app.route('/index/<xxx("d+"):nid>',endpoint='xx')
    def index(nid):
    url_for('xx',nid=123)
    return "Index"

    if __name__ == '__main__':
    app.run()
     

    二、视图函数

    flask除了支持FBV还支持CBV(包括CBV的正则表达式配置)

    
    
    from flask import Flask,url_for,views

    app = Flask(__name__)

    # 进行使用
    # @app.route('/index',endpoint='xx')
    # def index(nid):
    ##反向生成URL
    # url_for('xx',nid=123)
    # return "Index"
    #
    # app.add_url_rule('/index',index)
    def auth(func):
    def inner(*args, **kwargs):
    result = func(*args, **kwargs)
    return result
    return inner

    class IndexView(views.MethodView):
    # methods = ['POST']
      #装饰器在CBV中的使用
    decorators = [auth,]

    def get(self):
    v = url_for('index')
    print(v)
    return "GET"

    def post(self):
    return "GET"

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

    if __name__ == '__main__':
    app.run()
     

    三、请求和响应

    使用urllib转换网址上的中文,和16进制

    from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response
    from urllib.parse import urlencode,quote,unquote
    app = Flask(__name__)
    
    @app.route('/index',endpoint='xx')
    def index():
        from werkzeug.datastructures import ImmutableMultiDict
        get_data = request.args
        #转化成为字典
        get_dict = get_data.to_dict()
        get_dict['xx'] = '18'
        # 获取URL
        url = urlencode(get_dict)
        print(url)
    
        print(request.query_string)
        print(request.args)
    
        val = "%E6%8A%8A%E5%87%A0%E4%B8%AA"
        print(unquote(val))
        #
        # return "Index"
    
        # return "Index"
        # return redirect()
        # return render_template()
        # return jsonify(name='alex',age='18')
    
        response = make_response('xxxxx')
        response.headers['xxx'] = '123123'
        return response
    
    
    if __name__ == '__main__':
        # app.__call__
        app.run()

    四、模板语法

    和Django基本相同,更贴近Django的基本语法,支持各种数据类型,还支持函数(自定义模板语法)

    ##################view视图
    from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response,Markup
    from urllib.parse import urlencode,quote,unquote
    app = Flask(__name__)
    
    def test(a1,a2):
        return a1+a2
    
    @app.template_global()
    def sb(a1, a2):
        return a1 + a2 + 100
    
    
    @app.template_filter()
    def db(a1, a2, a3):
        return a1 + a2 + a3
    
    
    @app.route('/index',endpoint='xx')
    def index():
        v1 = "字符串"
        v2 = [11,22,33]
        v3 = {'k1':'v1','k2':'v2'}
        v4 = Markup("<input type='text' />")
        return render_template('index.html',v1=v1,v2=v2,v3=v3,v4=v4,test=test)
    
    
    if __name__ == '__main__':
        # app.__call__
        app.run()
    #########模板base###############
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>模板</h1>
        {%block body %} {%endblock%}
    
    </body>
    </html>
    ############继承模板的HTML#################
    {% extends 'layout.html'%}
    
    {%block body %}
        {{v1}}
    
        <ul>
            {% for item in v2 %}
            <li>{{item}}</li>
            {% endfor %}
        </ul>
        {{v2.1}}
    
        <ul>
            {% for k,v in v3.items() %}
            <li>{{k}}  {{v}}</li>
            {% endfor %}
        </ul>
        {{v3.k1}}
        {{v3.get('k1')}}
    
        {{v4}}
        <!--{{v4|safe}}-->
    
        <h1>{{test(1,19)}}</h1>
    
        {{sb(1,2)}}
    
        {{ 1|db(2,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') }}
    
    
    {%endblock%}

    五、session

    session的配置

    from flask import Flask,session,Session
    from urllib.parse import urlencode,quote,unquote
    from werkzeug.local import LocalProxy
    app = Flask(__name__)
    app.secret_key ='sdfsdfsdf'
    app.config['SESSION_COOKIE_NAME'] = 'session_lvning'
    """
    '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,
    'PERMANENT_SESSION_LIFETIME':           timedelta(days=31)
    """
    
    @app.route('/index',endpoint='xx')
    def index():
        # session本质上操作的是字典,假设session保存在数据库
        # session['xxx'] = 123
        # session['xx1'] = 123
        # session['xx2'] = 123
        # session['xx3'] = 123
        # del session['xx2']
        session['xx3'] = 123
        return "xxx"
    
    if __name__ == '__main__':
        # app.__call__
        app.run()

    六、闪现(flash)

    传递到下一个跳转页面的数据,但只想保留一次,一般使用session的flash方法

    from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request
    app = Flask(__name__)
    app.secret_key ='sdfsdfsdf'
    
    @app.route('/users')
    def users():
        # msg = request.args.get('msg','')
        # msg = session.get('msg')
        # if msg:
        #     del session['msg']
    
        v = get_flashed_messages()
        print(v)
        msg = ''
        return render_template('users.html',msg=msg)
    
    @app.route('/useradd')
    def user_add():
        # 在数据库中添加一条数据
        # 假设添加成功,在跳转到列表页面时,显示添加成功
        # return redirect('/users?msg=添加成功')
        # session['msg'] = '添加成功'
    
        flash('添加成功')
        return redirect('/users')
    
    
    if __name__ == '__main__':
        app.run()

    七、类似中间件

    from flask import Flask,session,Session,flash,get_flashed_messages,redirect,render_template,request
    app = Flask(__name__)
    app.secret_key ='sdfsdfsdf'
    
    @app.before_request
    def process_request1():
        print('process_request1')
    
    @app.after_request
    def process_response1(response):
        print('process_response1')
        return response
    
    
    @app.before_request
    def process_request2():
        print('process_request2')
    
    @app.after_request
    def process_response2(response):
        print('process_response2')
        return response
    
    
    @app.route('/index')
    def index():
        print('index')
        return 'Index'
    
    @app.route('/order')
    def order():
        print('order')
        return 'order'
    
    @app.route('/test')
    def test():
        print('test')
        return 'test'
    
    if __name__ == '__main__':
        app.run()
  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/ldq1996/p/8193809.html
Copyright © 2011-2022 走看看