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')
  1. from flask import Flask在这里我们为其导入了flask模块中的Flask类
  2. app = Flask(__name__)新建了一个flask对象,其中__name__参数用来确认我们的模板和文件的地址。
  3. 使用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中返回。(也可以添加响应码)

我们可以通过在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
还有许多杂项和安全的设定

  1. max_age 被保存时间数,单位秒。默认会话结束时删除
  2. expires 具体过期时间
  3. path 限制cookie的可用路径,默认为整个域名
  4. domain 设置可用域名
  5. secure True时,只有https可以使用
  6. 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…

Comments