MENU

Flask笔记

April 13, 2020 • 阅读: 1161 • 笔记&折腾



用两个字形容Flask[维基百科]  : 优雅
优雅 来形容这个工具再合适不过了,轻巧、简单、安全、扩展性强、社区强大,这些都是我喜欢它的原因。




Flask 官方文档: Flask 中文

Linux 部署 flask 项目 :Linux 部署 flask 项目

Flask 框架部署参考 : Flask 框架




新项目中有两个目录:
static: HTTP直接访问文件的文件夹(如CSS、js);
templates: 包含项目的 Jinja2[官方文档]模板,HTML 文件以及 JS 文件。

表单

以下是一个提交表单:
/login 路由:

@app.route('/login', methods=['POST', 'GET'])
def login():
    # 当请求方式是 POST
    if request.method == 'POST': 
        #print(request.form.get("user"))
        if request.form['user'] == 'admin':
            return 'Admin login successfully!'
        else:
            # return 'No such user!'
            title = request.args.get('title', request.form['user'])
            return render_template('login.html', title=title)
    # 当请求方式是 GET
    elif request.method == 'GET':
        title = request.args.get('title', 'comsters')
        return render_template('login.html', title=title)

login 表单 (login.html):

{% extends "layout.html" %}

{% block body %}
<form name="login" action="/login" method="post">
    Hello {{ title }}, please login by:
    <input type="text" name="user">
</form>
{% endblock %}

当 flask 项目运行时,初次访问请求方式是 GET ,所以 title 的值为 comsters , 当表单提交时,请求方式是 POST。
路由中 request 的 method 有四种:POST、GET、DELETE、PUT 。

Session

from flask import Flask, render_template,request, session, url_for, redirect

app = Flask(__name__)

@app.route('/login', methods=['POST', 'GET'])
def login():
    # 当请求方式是 POST
    if request.method == 'POST':
        #print(request.form.get("user"))
        if request.form['user'] == 'admin':
            session['user'] = request.form['user']
            return 'Admin login successfully!'
            # return redirect(url_for('login'))
        else:
            return 'No such user!'
            # session['user'] = request.form['user']
            # title = request.args.get('title', request.form['user'])
            # return render_template('login.html', title=title)
    if 'user' in session:
        return 'Hello %s!' % session['user']
    # 当请求方式是 GET
    else:
        title = request.args.get('title', 'comsters')
        return render_template('login.html', title=title)

@app.route('/logout')
def logout():
    session.pop('user', None)
    return redirect(url_for('login'))

app.secret_key = '123sdf'
if __name__ == '__main__':
    app.run(debug=True, port=8777)

使用 Session 时一定要设置秘钥( secret_key )进行加密。使用 session['user'] 调用。

构造响应头

from flask import Flask, make_response, render_template,request, session, url_for, redirect

app = Flask(__name__)

@app.route('/login', methods=['POST', 'GET'])
def login():
    # 当请求方式是 POST
    if request.method == 'POST':
        #print(request.form.get("user"))
        if request.form['user'] == 'admin':
            session['user'] = request.form['user']
            return 'Admin login successfully!'
            # return redirect(url_for('login'))
        else:
            return 'No such user!'
            # session['user'] = request.form['user']
            # title = request.args.get('title', request.form['user'])
            # return render_template('login.html', title=title)
    if 'user' in session:
        return 'Hello %s!' % session['user']
    # 当请求方式是 GET
    else:
        title = request.args.get('title', 'comsters')
        response = make_response(render_template('login.html', title=title),200)
        response.headers['key'] = 'lelelle'
        return response

@app.route('/logout')
def logout():
    session.pop('user', None)
    return redirect(url_for('login'))

app.secret_key = '123sdf'
if __name__ == '__main__':
    app.run(debug=True, port=8777)

浏览器按 F12 可查看 key 的值。

Cookie

from flask import Flask, make_response, render_template,request, session, url_for, redirect
import time

app = Flask(__name__)

@app.route('/login', methods=['POST', 'GET'])
def login():
    # 当请求方式是 POST
    if request.method == 'POST':
        #print(request.form.get("user"))
        if request.form['user'] == 'admin':
            session['user'] = request.form['user']
            response = make_response('Admin login successfully!')
            response.set_cookie('login_time', time.strftime('%Y-%m-%d %H:%M:%S'))
        else:
            return 'No such user!'
    # 当请求方式是 GET
    else:
        if 'user' in session:
            login_time = request.cookies.get('login_time')
            response = make_response('Hello %s, you logged in on %s' % (session['user'], login_time))
        else:
            title = request.args.get('title', 'comsters')
            response = make_response(render_template('login.html', title=title), 200)
            response.headers['key'] = 'lelelle'
            return response
    return response

@app.route('/logout')
def logout():
    session.pop('user', None)
    return redirect(url_for('login'))

app.secret_key = '123sdf'
if __name__ == '__main__':
    app.run(debug=True, port=8777)

使用 .set_cookie( key, value, time) 来存储 cookie 值,第三个参数是cookie存在的时间,单位是秒,默认是浏览页面关闭时销毁该 cookie。
使用 .cookies.get( key ) 使用cookie值。




使用 ajax 通信

js 端:

function clicks(){
    sendData = {'user':'admin'};
    $.ajax({
        url:"updatebg",
        type:"post",
        data:sendData,
        dataType: 'json',
        processData:false,
        contentType:false,
        success:function(data){
            $('#divbg').css("background",data.colors);
        },
        error:function(e){
                alert("error");
        }
    })
}

sendData : 发送数据,JSON格式
url : 接口,地址为路由地址
type : type 必须和接口保持一致,常用的有 POST、GET
data : 返回的数据格式为 JSON

python后台端:

@app.route('/updatebg', methods=['POST'], strict_slashes=False)
def update():
    return jsonify({"colors": "red"})

返回的数据格式为 JSON,使用 jsonify 对数据进行格式化,路由为接口地址。

Last Modified: February 6, 2021