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()
  • 相关阅读:
    爬虫(Xpath)——爬tieba.baidu.com
    爬虫(正则)——爬neihan8
    爬虫(cookie)——renren模拟登陆
    爬虫(ProxyHandler)——代理
    爬虫(GET)——handler处理器和自定义opener
    爬虫(AJEX)——豆瓣动态页面
    爬虫(POST)——有道翻译(有bug)
    一次跨域请求出现 OPTIONS 请求的问题及解决方法
    现代JS中的流程控制:详解Callbacks 、Promises 、Async/Await
    nodejs中的子进程,深入解析child_process模块和cluster模块
  • 原文地址:https://www.cnblogs.com/ldq1996/p/8193809.html
Copyright © 2011-2022 走看看