FLASK学习笔记-WIP
flask学习笔记
这里是我的flask学习笔记,绝赞更新中!欢迎批评斧正。
[TOC]
基本代码
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Fuck this world!!!"
@app.route("/test/av<int:video_id>")
def test(video_id):
return 'welcome %s' % video_id
if __name__ == '__main__':
app.run(host='localhost')
from flask import Flask
在这里我们为其导入了flask模块中的Flask类app = Flask(__name__)
新建了一个flask对象,其中__name__
参数用来确认我们的模板和文件的地址。- 使用
route
函数和装饰器来确定激活函数的地址,这个被称为路由
启动flask
windows
set FLASK_APP=main.py
# 确定启动起始点
set FLASK_VNE=development
# 设定为调试模式,代码一旦有改动自动重启服务器
# 在实际中不要开启
flask run --port 8848
# 启动flask
# --host 设置地址
# --port 设置端口
linux
与windows类似
$ export FLASK_APP=main.py
...
路由
@app.route()
便是一个路由,在括号内填入地址,如上例一样,即可完成函数与路由的绑定。
路由中的参数
@app.route("/test/av<int:video_id>")
def test(video_id):
if(video_id == 114514):
welcomeS = 'いいよ!こいよ!'
else:
welcomeS = "There is the"
return welcomeS + ' ' + str(video_id)
在上例中,我们在路由中规定了<int:video_id>
来定义正整数类型参数video_id
。再将其填入链接的函数内即可应用该参数。
以下列出了可填入的参数
string:接受一切不包括斜杠的字符
int:接受正整数
float:接受正浮点数
path:接受一切字符
uuid:接受uuid字符串
请求钩子
before_first_request:在第一个请求前运行
before_request:在每个请求前运行
after_request:在没有异常结束的请求后执行
teardown_reques:|在每个请求后执行(不论是否有异常)
after_this_request:在指定请求结束后执行
graph TB; request(请求A)-->ifFirst{第一次请求?}; ifFirst--Yes-->before_first_request; ifFirst--No-->before_request; before_first_request-->before_request; before_request-->viewA[视图A]; before_request-->viewB[视图B]; before_request-->viewC[视图C]; viewC-->after_this_request; after_this_request-->ifExcept{有无异常?}; viewA-->ifExcept; viewB-->ifExcept; ifExcept--Yes-->teardown_request; ifExcept--No-->after_request; after_request-->teardown_request; teardown_request-->response(响应A)
创建方式:
@app.before_first_request
def before_first_request():
pass
@app.before_request
def before_request():
pass
@app.route('/a')
def A():
pass
@flask.after_this_request
def after_this_request():
pass
return ''
@app.after_request
def after_request():
pass
@app.teardown_request
def teardown_request():
pass
重定向
其关键是看其有没有/
@app.route("/test_1")
def test_1():
return "nothing"
@app.route("/test_2/")
def test_2():
return "nothing"
在上例的test_1
中,我们没有在其最后添加“/”,这使得解释器(?)会将其解释为一个文件。如果访问时,在其背后加上“/”,会导致404错误。这样可以保持 URL 唯一,并帮助搜索引擎避免重复索引同一页面。
而test_2
一例中,我们在定义是便加上了“/”,这样可以使其看起来像一个文件夹。
响应
302
302跳转有2种方式实现
pass
return '...', 302, {'Location':'https://www.baidu.com'}
from flask import Flask, redirect
pass
return redirect('https://www.baidu.com')
其它响应码
我们可以自定义使指定页面返回我们想要的响应码
使用函数abort(响应码)
需要from flask import abort
自定MIME格式
from flask import Flask, make_response
pass
@app.route('/a')
def A():
response = make_response('Hello World!')
response.mimetype = 'text/plain'
return response
json格式
自然,我们可以将MIME设置为json。
通常,一个字典即可代表一段json。
但使用json.dumps()
可以将元组和列表也序列化为json(没有键)
或者使用jsonify()
,在return
中返回。(也可以添加响应码)
Cookie
我们可以通过在make_response()
对象中对cookie进行设置。
@app.route('/set/<name>')
def setCooike(name):
response = make_response(redirect(url_for('hello')))
response.set_cookie('name', name)
return response
上例可以在设置cookie之后重响应到/hello
还有许多杂项和安全的设定
- max_age 被保存时间数,单位秒。默认会话结束时删除
- expires 具体过期时间
- path 限制cookie的可用路径,默认为整个域名
- domain 设置可用域名
- secure True时,只有https可以使用
- httponly True时,禁止客户端JS获取cookie
session
使用session首先需要设定secret_key
我们可以直接:app.secret_key="value"
或者将其设定为系统变量,用os模块获取
一个用户登录的模型
@app.route('/login')
def UserLogin():
name = FL.request.cookies.get('name')
if name is not None:
FL.session['LoggedIn'] = True
return FL.redirect(FL.url_for('hello'))
我们使用session['key']={value}
来设定一个session
一个用户登出模型
@app.route('/logout')
def UserLogout():
if 'LoggedIn' in FL.session:
FL.session.pop('LoggedIn')
response = FL.make_response(FL.redirect(FL.url_for('hello')))
response.delete_cookie('name')
return response
我们可以使用session.pop('key')
来删除一个session
WIP…