0

FLASK学习笔记-WIP

 2 years ago
source link: https://afkl-cuit.github.io/2020/02/24/FLASK%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-WIP/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
2 years ago8 minutes read (About 1218 words)  10 visits

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跳转有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
还有许多杂项和安全的设定

  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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK