浅谈flask-2

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kun1280437633/article/details/80247122

1、response: 用来响应客户端的数据,返回的时候有两种形式指定:

    (1) 直接返回元祖的形式

            a. 直接返回, 响应体         return "hello"

            b. 返回 响应体+状态码      return "hello", 999

            c. 返回 响应体 + 状态码 + 响应头

    (2) 第二种返回reponse对象的形式    response = make_response( )

2、当服务器向浏览器设置数据的时候,可以指定格式(例json):

    (1) 直接指定headers,里面的Content-Type 为application/json

    (2)使用jsonify, 也可以,flask自带的

    代码

from flask import Flask,make_response, jsonify
app = Flask(__name__)

@app.route('/')
def work1():
    # response = make_response()
    # response.headers['Content-Type'] = 'application/json'
    # return response
    # dict = {
    #     "name": "zhangsa"
    # }
    # return jsonify(dict)
    return jsonify({'name': "zhang", 'age': 14})

    # return jsonify(name="zhangsan", age=14)

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

3、请求钩子:在访问某些视图函数的时候,会顺带着执行,请求钩子所修饰的方法

    常见的请求钩子有四中

    (1) before_first_request,第一次请求的时候会执行,初始化操作,比如:数据库的链接,权限过滤

    (2) before_request,每次请求前执行,统一指定该资源和浏览器的交互过程

    (3)after_request,每次请求后执行,统一指定该资源和浏览器的交互过程

    (4)teardown_request,每次请求销毁后, 用来记录服务器的异常信息

4、反向解析(可以根据视图函数的名字找到所对应的路由路径)

    格式:url_for('函数名字',key=value)

    注意点

        (1)当使用url_for传递参数的时候,可以直接通过request.args方式去获取

        (2)如果当成路径传递,那么解析的路径中的参数, 必须要与传递的参数完全一致,可以有两种情况接受

    代码

from flask import Flask,redirect,request,url_for
app = Flask(__name__)

@app.route('/work1')
def work1( ):
    return 'hello'

@app.route('/<int:id>')
def work2(id):
    return "<a href='%s'>哈哈</a>"%url_for('work3',token =id)

#方法一
# @app.route('/work/<int:token>')
#方法二
# @app.route('/work<int:token>')
# def work3(token):
#     if token ==12:
#         return 'nihao'
#     else:
#         return redirect('/work1')

#方法三
@app.route('/work')
def work3():
    token = request.args.get('token')
    if token == "12":
        return 'nihao'
    else:
        return redirect('/work1')

if __name__ == '__main__':

    app.run(debug=True)

5、存储cookie和session

    (1)cookie:用来记录用户和服务器的交互数据,比如,链接的状态信息,sessionID,csrf_token, 由服务器进行设置

    (2)cookie的设置:response.set_cookie(key,value,maxAge): maxAge表示过期时间, 如果不设置默认一次回话结束

    (3)cookie的获取: request.cookies[key]

    (4)session: 用来存储客户的铭感信息, 比如:密码,状态信息等, 浏览器访问,服务器存储

    (5)设置session: session[key] = value

    (6) 获取session: session[key], session.get(key)

    session注意点:

          <1>. session空间的编号sessionID,会存储在cookies

          <2>. sessionID的生成依赖于SECRET_KEY

    代码

from flask import Flask,session, make_response, request

app = Flask(__name__)

@app.route('/set_cookie')
def set_cookie( ):
    response = make_response('set_cookie')
    response.set_cookie('name', 'zhangsan')
    response.set_cookie('age', '13', 10)
    return response

@app.route('/get_cookie')
def get_cookie():

    # 如果使用中括号的形式获取,不存在就会报错, 如果使用get,不存在返回none
    name = request.cookies['name']
    age = request.cookies.get('age')

    return 'name is %s,age is %s'% (name, age)

@app.route('/set_session/<path:name>')
def set_session(name):
    session['name'] = name
    session['age'] = 14

    return 'hellloworld'

@app.route('/get_session')
def get_session():
    name = session['name']
    age = session.get('age')

    return 'name is %s,age is %s'%(name,age)

if __name__ == '__main__':

    app.run(debug=True)

6、请求上下文和应用上下文

    (1)请求上下文:

            <1>.request: 用来封装浏览器的参数信息,可以理解成一个线程的局部变量

            <2>.session: 用来记录浏览器访问服务器的敏感信息.


    (2) 应用上下文:

        current_app: 相当于是app的一个代理,主要是用于模块化开发,和整个整个应用程序相关

        g: 和某一次的请求相关,只要这一次请求没有结束,g对象都有效. (配合装饰器使用)

7、flask并没有提供复杂的功能,只有基本的路由映射(Werkzeug)和模板渲染功能(jinja2)

    如果想要使用额外的功能,需要使用扩展包:安装: pip install flask_script

    有两点作用:

        (1)在部署更换服务器的时候,不需要修改源代码就可以指定ip端口运行

            使用流程:

                        1. 安装,导入包

                        2. 通过Manager管理app

                        3. 通过manager对象来运行程序

                        4. 运行命令: python xxx.py runserver -h ip地址  -p 端口

         (2) 进行数据库的迁移操作(后面再讲解)

    代码

from flask import Flask,current_app
from flask_script import Manager
app = Flask(__name__)


#设置debug
#方法一

# app.debug=True
#方法二
# class Config(object):
#     DEBUG = True
# app.config.from_object(Config)
# 方法三
app.config.from_pyfile('./config.ini')   # config.ini是文件里面写 DEBUG = True
#2通过Manager管理app
manager = Manager(app)

@app.route('/')
def work1():
    print current_app.url_map

    return'hello'

if __name__ == '__main__':
    # app.run(debug=True)

    manager.run()

8、模板(jinja2中提供了自带的模块渲染引擎,模板说白了就是html文件)

    使用模板的流程:    

        (1) 创建html文件,位于: templates,因为创建app对象的时候templates_foleder默认是templates

        (2)使用render_template("模板文件名",key=value)

    模板的语法格式 

        (1)获取变量的值  {{ 变量名 }}

        (2)分支语句if     {% if 条件 %}   {% endif %}

        (3)循环语句for   {% for 变量名 in 容器 %} {% endfor %}

        (4)注释  {#注释#}

9、过滤器(jinja2模板中自带了一些常见的过滤器: 相当于python的函数一样)

    字符串过滤器:

        reverser: 反转

        upper: 大写

        lower: 小写

         title: 所有所字母都大写

           ....

     列表过滤器:

        first:第一个

        last:最后一个

        length:个数

        sum:求和


    自定义过滤器: 当jinja2提供的模板满足不了需求的时候,需要自定义

    自定过滤器有两种格式:

        (1)第一种格式:

                <1>.先编写视图函数

                <2>.然后使用app.add_template_filter(函数,"过滤器名字")


        (2)第二种格式:

                <1>.直接使用@app.template_filter("过滤器名字")装饰函数

    代码

from flask import Flask,render_template
app = Flask(__name__)

@app.template_filter('ss')
def work3(ls):
    return ls[::2]

def work2(ls):
    list = []
    for i in ls:
        if i % 2 == 0:
            list.append(i)

    return list

app.add_template_filter(work2,'even')

@app.route('/')
def work1():
   return render_template('file03.html',mylist = [x for x in range(0,10)])

if __name__ == '__main__':

    app.run(debug=True)

 10、宏

    macro:可以理解为python中的函数, 在需要的时候调用,封装了一段功能

    定义宏: {%macro 宏名()%}   {%endmacro%}

    调用宏: 

    (1)当前文件: {{ 宏名(参数) }}

    (2)其他文件: {% import '宏文件' as 别名%}    {{ 别名.宏名(参数) }}

11、继承和包含

(1)继承: 共性抽取,代码复用

            {% extends '文件名' %}

            如果不想使用父类内容可以重新覆盖

            {% block 父类名称 %}  

            {% endblock%}



(2)包含: 针对不变的内容进行包含

            {% include '文件名'%}

            {% include '文件名' ignore missing%}

猜你喜欢

转载自blog.csdn.net/kun1280437633/article/details/80247122