美文网首页
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