美文网首页
flask基础

flask基础

作者: 马梦里 | 来源:发表于2017-12-15 12:44 被阅读0次

    一、

    from flask import (
        Flask,
        render_template,
        request,
        redirect,
        url_for,
    )
    import time
    
    # 先要初始化一个 Flask 实例
    app = Flask(__name__)
    message_list = []
    
    # 用 log 函数把所有输出写入到文件,这样就能很方便地掌控全局了
    # 即便你关掉程序,也能再次打开来查看,这就是个时光机
    def log(*args, **kwargs):
        format = '%Y/%m/%d %H:%M:%S'
        value = time.localtime(int(time.time()))
        dt = time.strftime(format, value)
        # 中文 windows 平台默认打开的文件编码是 gbk 所以需要指定一下
        with open('log.gua.txt', 'a', encoding='utf-8') as f:
            # 通过 file 参数可以把输出写入到文件 f 中
            # 需要注意的是 **kwargs 必须是最后一个参数
            print(dt, *args, **kwargs)
    
    # 定义路由和路由处理函数的方式如下
    # ==========================
    # 用 app.route 函数定义路由,参数是一个 path 路径
    # 下一行紧跟着的函数是处理这个请求的函数
    # @ 是一个叫装饰器的东西, 现在无必要知道具体的原理, 只要用它就好了
    # 注意 methods 参数是一个 list,它规定了这个函数能接受的 HTTP 方法
    @app.route('/')
    def hello_world():
        return '<h1>Hello Gua</h1>'
    
    # 这是访问 /message 的请求
    # methods 默认是 ['GET'] 因此可以省略
    @app.route('/message')
    def message_view():
        # request.args 是 flask 保存 URL 中的参数的属性
        # 访问 http://127.0.0.1:2000/message?a=1
        # (ImmutableMultiDict 是 flask 的自定义类型, 意思是不可以改变的字典)
        # request ImmutableMultiDict([('a', '1')])   不能被更改,只能取数据,和普通字典的使用一致
    
        # render_template 是一个 flask 内置函数
        # 它的作用是读取并返回 templates 文件夹中的模板文件
        # messages 是传给模板的参数,这样就能在模板中使用这个变量了
        return render_template('message_index.html', messages=message_list)
    
    # 这个路由函数只支持 POST 方法
    @app.route('/message/add', methods=['POST', 'GET'])
    def message_add():
        # request.form 是 flask 保存 POST 请求的表单数据的属性
        log('request, POST 的 form 表单数据', request.form)
        # 把数据生成一个 dict 存到 message_list 中去
        if request.method == 'POST':
            data = {
                'content': request.form.get('message_post', ''),
            }
        else:
            data = {
                'content': request.args.get('message_get'),
            }
        message_list.append(data)
    
        # 这和我们写过的函数是一样的
        # return redirect('/message')
        # 一般来说,我们会用 url_for 生成路由,如下
        # 注意, url_for 参数是路由函数的名字(格式为字符串)
        # url_for('message_view') == '/message'
        return redirect(url_for('message_view'))
    
    # 运行服务器
    if __name__ == '__main__':
        # debug 模式可以自动加载你对代码的变动, 所以不用重启程序
        # localhost(127.0.0.1) 只能让本机让问
        # host 参数指定为 '0.0.0.0' 可以让别的机器访问你的代码
        # 部署的时候一定要为 0.0.0.0
        # register_route()
        config = dict(
            # 如果对脚本有改动,可以不用重启服务器,它可以自动识别并重启服务器
            debug=True,
            host='localhost',
            port=3000,
        )
        app.run(**config)
        # app.run() 开始运行服务器
    

    flask基本架构:

    1. Flask -- 实例一个flask对象,一般命名为app
    2. render_template用来处理模板与jinja语法(django类似);
    3. request是一个全局变量,里面包含了提交的方法和数据;
    4. redirect用来实现重定向,重定向的函数名称url_for包裹;

    流程:
    通过Flask(__name__)实例化一个flask对象app,通过app.run()方法运行服务器。每个视图函数上都有一个装饰器@app.route(),定义path,以及方法。

    注意:

    • 每个视图函数头上都需要有一个路由装饰器
    • form是属性,而非方法;
    • <textarea></textarea>是一个闭标签;
    • debug = True的作用

    request

    request是一个全局变量,有如下属性,包含了请求的相关数据:

    1. method
      请求方法(POSTGET
    2. form
      POST方法提交的数据都在这个属性值中,MultiDict类型,和字典的使用方式一样:form['key']form.get('key', None)
    3. args
      保存GET方法提交的数据,MultiDict类型,一般用get方法获取
    4. values
      包含了GETPOST方法提交的数据
    5. cookie
      包含请求中的所有cookies,类型为dict,取值方式:
      request.cookie.get('key', None)
      设置cookie的时候需要手动构造一个response对象,make_response方法就可以构造一个response对象,里面的参数一般会放在body里面,然后将cookies添加进去:
    def cookies_set():
        name = request.args.get("name", "Test")
        resp = make_response("Name accepted")
        resp.set_cookie("name", name)
        return resp
    

    获取:request.cookies.get('name', None)

    1. headers
      请求头,类型为dict
    2. files
      请求上传的文件,可通过POST或PUT请求上传
    3. json
      如果请求头中的mimetypeapplication/json,那么request.jsonz属性可以返回解析的json数据
    4. get_json()
      和上一个属性一样,用这个方法较多
    图片.png

    render_template

    • 默认的路径是 /templates/ ,所以不需要在模板前面额外添加了

    url_for()

    • 在 app.py 注册蓝图的时候,url_for() 就知道了视图函数所处的位置,也不需要额外添加路径 /routes/
    1.PNG

    相关文章

      网友评论

          本文标题:flask基础

          本文链接:https://www.haomeiwen.com/subject/jdarwxtx.html