13.web开发之flask-2


支持html返回

@app.route('/a')
def a_page():
    return Response('

haha nihao

' '

' '

ddddd

', 200)

模板使用

调用模板

在templates文件下新建一个HTML 5 file,名为tempa.html




    
    a路由测试


    

this is a h1

此时直接return文件名即可,原因在于之前我们已经定义了template_foldertemplates 文件

@app.route('/a')
def a_page():
    return flask.render_template("tempa.html")

模板继承

新建一个zi1.html,作为tempa的子模板

{% extends 'tempa.html'%}
hahanihao

tempa.html




    
    a路由测试


    

I am father tempa

此时调用子模板,下面的hahanihao并不能显示

@app.route('/a')
def a_page():
    return flask.render_template("zi1.html")

对继承模板进行修改

main.py

@app.route('/a')
def a_page():
    return flask.render_template("zi1.html")

tempa.html




    
    a路由测试


		
    

I am father tempa

{% block contentBlock %}

father html temp

{% endblock %}

I am father tempa last

zi1.html

{% extends 'tempa.html'%}


{% block contentBlock %}


{{super()}}


zi mu ban

{% endblock %}

  • 如果zi1.html不使用super()继承父模板原有的内容,原内容将消失

    {% extends 'tempa.html'%}
    
    
    {% block contentBlock %}
    
    

    zi mu ban

    {% endblock %}

模板传参与过滤器

Flask默认使用jinja模板语言,其中有关参数互动的开始与结束都是jinja模板

模板传参

jinja模板参数互动几个注意点

存放变量:{{ }}
控制代码块:{% %}
注释符:{# #}

main.py

@app.route('/a/')
def a_page(id):
    # python参数传入都是string类型,
    m_int = int(id) + 20
    m_str = "hahanihao"
    m_list = ["xiaoming", "xiaohong", "xiaoli"]
    # mint会直接传入tempa的{{mint}}中并替换
    return flask.render_template("tempa.html", mint=m_int, mstr=m_str, mlist=m_list)

tempa.html




    
    a路由测试


    

I am father tempa {{mint}} ---- {{mstr}}

mlist is : {{mlist[1]}}

过滤器

tempa.html的body部分

I am father tempa {{mint}} ---- {{mstr}}

mlist is : {{mlist | dore}}

main.py

# 过滤器
@app.template_filter('dore')
def do_reverse(li):
    temp = list(li)
    temp.reverse()
    return temp

过滤器原理:定义一个过滤器名为“dore”,调用时将HTML中的参数mlist传入过滤器作为过滤器参数li,将其变成list并进行翻转,之后再return到HTML中重新渲染,“ | ”即为过滤器

控制代码块

控制代码块为{% %},之前的模板继承也是控制代码块的一种

main.py

@app.route('/a/')
def a_page(id):
    # python参数传入都是string类型,
    m_int = int(id) + 20
    m_str = "hahanihao"
    m_list = ["xiaoming", "xiaohong", "xiaoli"]
    vip = 1
    # mint会直接传入tempa的{{mint}}中并替换
    return flask.render_template("tempa.html", mint=m_int, mstr=m_str, mlist=m_list,vip=vip)

tempa.html


{% for item in mlist %}
    
  • {{item}}

  • {% endfor %} {% for num in range(1,10) %}
  • {{num}}号
  • {% endfor %} {% if vip == 0 %}

    你没充值

    {% elif vip == 1 %}

    Lv1的内容

    {% endif %}

    Cookie与Session交互

    cookie交互

    main.py

    @app.route('/b')
    def b_page():
        response = flask.make_response('success')
        # 设置cookie,key为user_id,value为10,存活时间为60
        response.set_cookie('user_id', '10', max_age=3600)
        response.set_cookie('vip', '0', max_age=3600)
        return response
    
    @app.route('/a')
    def a_page():
        # 读取cookie
        user_id = request.cookies.get('user_id')
        vip = request.cookies.get('vip')
        return flask.render_template("tempa.html",user_id=user_id,vip=vip)
    
    @app.route('/log_out')
    def log_out():
        response = flask.make_response('log out now')
        response.delete_cookie('user_id')
        response.delete_cookie('vip')
        return response
    

    tempa.html

    {{user_id}}
    
    {% if vip == '0' %} {{'你不是vip'}} {% elif vip == '1' %} {{'您好'}} {% endif %}

    用户在访问/b时相当于登录,同时创建cookievip值,随后再访问/a读取cookie,并在前端显示10(user_id)和vip的判断(你不是vip),此时可以通过火狐自带的cookie编辑器编辑vip值为1变成vip并跳出vip效果(您好),这时候访问/log_out相当于登出,再次访问/a因为没有cookie值所以为None

    session交互

    main.py

    from datetime import timedelta
    
    # 配置加密字符串
    app.config['SECRET_KEY'] = "key123"
    # 设置session存活时间7天有效,不通过timedelta默认是秒为单位
    app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
    
    @app.route('/log_in')
    def b_page():
        # 设置session
        session['user_id'] = "20"
        session['vip'] = '0'
        return 'success'
    
    @app.route('/a')
    def a_page():
        # 读取session
        user_id = session['user_id']
        vip = session['vip']
        return flask.render_template("tempa.html", user_id=user_id, vip=vip)
    
    # 清理session
    @app.route('/log_out')
    def log_out():
    		
    		# 法一:将session的不同key置空
        #session.pop('user_id',None)
        #session.pop('vip',None)
    	
    		# 法二:将session的key设为不存在
        #session['user_id'] = False
    
        # 法三:直接清空所有的session
        session.clear()
        return 'log out success'
    

    先访问log_in登录,保存session值,访问/a相当于用户界面,显示user_id(20)和不是vip的内容(你不是vip),此时用查看的cookie的方法发现内容加密且无法修改,说明session保存在服务端(session读取占用服务器资源),此时访问/log_out后session删除