一、
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基本架构:
-
Flask
-- 实例一个flask
对象,一般命名为app
; -
render_template
用来处理模板与jinja语法(django
类似); -
request
是一个全局变量,里面包含了提交的方法和数据; -
redirect
用来实现重定向,重定向的函数名称由url_for
包裹;
流程:
通过Flask(__name__)
实例化一个flask
对象app
,通过app.run()
方法运行服务器。每个视图函数上都有一个装饰器@app.route()
,定义path
,以及方法。
注意:
- 每个视图函数头上都需要有一个路由装饰器
- form是属性,而非方法;
- <textarea></textarea>是一个闭标签;
- debug = True的作用
request
request是一个全局变量,有如下属性,包含了请求的相关数据:
- method
请求方法(POST
或GET
) - form
POST
方法提交的数据都在这个属性值中,MultiDict
类型,和字典的使用方式一样:form['key']
、form.get('key', None)
- args
保存GET
方法提交的数据,MultiDict
类型,一般用get
方法获取 - values
包含了GET
和POST
方法提交的数据 - 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)
- headers
请求头,类型为dict - files
请求上传的文件,可通过POST或PUT请求上传 - json
如果请求头中的mimetype
是application/json
,那么request.json
z属性可以返回解析的json数据 - get_json()
和上一个属性一样,用这个方法较多
![](https://img.haomeiwen.com/i7998142/d2967893970ca447.png)
render_template
- 默认的路径是 /templates/ ,所以不需要在模板前面额外添加了
url_for()
- 在 app.py 注册蓝图的时候,url_for() 就知道了视图函数所处的位置,也不需要额外添加路径 /routes/
网友评论