0
点赞
收藏
分享

微信扫一扫

Flask入门

奔跑的酆 2021-10-04 阅读 62

1. 最简单的Flask程序

from flask import Flask

# 创建Flask对象
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world'


if __name__ == '__main__':
    app.run()


运行程序


测试,测试地址http://127.0.0.1:5000

2. 修改app的run

from flask import Flask

# 创建Flask对象
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world'


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

修改了三个参数
第一个参数是debug,是否开启调试模式
第二个参数是port,是打开的端口地址
第三个参数是host,是开启的IP地址,默认是127.0.0.1(只允许本机访问),修改为0.0.0.0(允许其他机器进行访问)


运行程序


3. 修改请求方式

默认是支持GET请求,现在添加支持POST请求

from flask import Flask, request

# 创建Flask对象
app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def hello_world():
    # 判断请求方式
    if request.method == 'GET':
        return 'request method is get'
    elif request.method == 'POST':
        return 'request method is post'


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

使用postman进行测试
测试,测试地址http://127.0.0.1:8080,请求方式get


测试,测试地址http://127.0.0.1:8080,请求方式post

4. 修改请求路由

  • 可以使用不同的装饰器同时装饰一个视图函数
from flask import Flask, request

# 创建Flask对象
app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def hello_world():
    if request.method == 'GET':
        return 'request method is get'
    elif request.method == 'POST':
        return 'request method is post'


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址http://127.0.0.1:8080/index

  • 可以使用相同的装饰器装饰不同的视图函数
    如果装饰器和请求方式完全相同,那么只会执行第一个视图函数
    如果装饰器相同,请求方式不同,那么两个互不干扰
from flask import Flask, request

# 创建Flask对象
app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def first():
    return 'first'


@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def second():
    return 'second'


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址http://127.0.0.1:8080/index

5. 路由重定向

引入redirect

from flask import Flask, request, redirect

# 创建Flask对象
app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def login():
    url = '/redirect'
    return redirect(url)


@app.route('/redirect', methods=['GET', 'POST'])
def profile():
    return 'redirect'


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址http://127.0.0.1:8080/index

上述例子用到的url路径,当路径被修改时,则需要同步修改相关代码
如果我们使用url_for,则绑定的是视图函数(通常视图函数是不修改的)
引入url_for

from flask import Flask, request, redirect, url_for

# 创建Flask对象
app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def login():
    return redirect(url_for('profile'))


@app.route('/redirect', methods=['GET', 'POST'])
def profile():
    return 'redirect'


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

6. 动态参数路由

from flask import Flask, request, redirect, url_for

# 创建Flask对象
app = Flask(__name__)


@app.route('/info/<name>', methods=['GET', 'POST'])
def get_name(name):
    return 'name is {}'.format(name)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址http://127.0.0.1:8080/info/jack


上述例子中,没有指定参数类型,则默认参数为string类型。
可以指定参数类型

  • string
  • float
  • int
from flask import Flask, request, redirect, url_for

# 创建Flask对象
app = Flask(__name__)


@app.route('/info/<name>', methods=['GET', 'POST'])
def get_name(name):
    return 'name is {}'.format(name)


@app.route('/mid/<int:mid>', methods=['GET', 'POST'])
def get_id(mid):
    return 'mid is {}'.format(mid)


@app.route('/fid/<float:fid>', methods=['GET', 'POST'])
def get_float(fid):
    return 'fid is {}'.format(fid)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址http://127.0.0.1:8080/mid/10


测试,测试地址http://127.0.0.1:8080/fid/1.25

7. 新增html文件

新建templates文件夹,并在该文件夹下新建html文件

form.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
</head>
<body>
<div>这是一个测试页面</div>
</body>
</html>

run.py

from flask import Flask, render_template

# 创建Flask对象
app = Flask(__name__)


@app.route('/form', methods=['GET', 'POST'])
def get_name():
    return render_template('form.html')


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址http://127.0.0.1:8080/form

8. 新增css文件

新建static文件夹,在static文件夹下新增css文件夹,在css文件夹新建css文件

mystyle.css

.text-color{
    color: red;
}

form.html
新增一行<link rel="stylesheet" href="../static/css/mystyle.css">
其中属性href为css文件的位置,..的意思是返回上一级目录
div标签添加mystyle.css文件中text-color样式

<!DOCTYPE html>
<html lang="en">
<link rel="stylesheet" href="../static/css/mystyle.css">
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
</head>
<body>
<div class="text-color">这是一个测试页面</div>
</body>
</html>

测试,测试地址http://127.0.0.1:8080/form

9. 新增js文件

static文件夹下新增js文件夹,在js文件夹新建js文件

myjavascript.js

function myClick(){
    document.getElementById('kkk').style.backgroundColor='red'
}

form.html
默认div背景颜色为绿色,点击按钮触发js事件,修改背景颜色为红色

<!DOCTYPE html>
<html lang="en">
<script src="../static/js/myjavascript.js" type="application/javascript"></script>
<link rel="stylesheet" href="../static/css/mystyle.css">
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
</head>
<body>
<button onclick="myClick()">点击改变颜色</button>
<div id="kkk" style="height: 400px;width: 400px;background-color: green"></div>
</body>
</html>

测试,测试地址http://127.0.0.1:8080/form


10. request对象

from flask import request

request对象中保存了HTTP请求中的一切信息

1. 接收表单请求

使用request.form参数

form.html

<!DOCTYPE html>
<html lang="en">
<script src="../static/js/myjavascript.js" type="application/javascript"></script>
<link rel="stylesheet" href="../static/css/mystyle.css">
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
</head>
<body>
<form action="login" method="post">
    <input type="text" name="user" placeholder="用户名">
    <input type="text" name="password" placeholder="密码">
    <input type="submit" value="提交">
</form>
</body>
</html>

run.py

from flask import Flask, render_template, request

# 创建Flask对象
app = Flask(__name__)


# 返回表单页面
@app.route('/form', methods=['GET', 'POST'])
def get_name():
    return render_template('form.html')


# 验证登录
@app.route('/login', methods=['POST'])
def login():
    user = request.form.get('user')
    password = request.form.get('password')
    return 'user is {} password is {}'.format(user, password)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址http://127.0.0.1:8080/form

分别输入用户名和密码,然后点击提交按钮
测试用户名:kun
测试密码:123456


输入完成后,挑战到login路由

2. 接收get请求

使用request.args参数
run.py

from flask import Flask, render_template, request

# 创建Flask对象
app = Flask(__name__)


@app.route('/login')
def get_name():
    user = request.args.get('user')
    password = request.args.get('password')
    return 'user is {} password is {}'.format(user, password)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址127.0.0.1:8080/login?user=kkk&password=123456

3. 接收json方式

使用request.json参数
run.py

from flask import Flask, render_template, request

# 创建Flask对象
app = Flask(__name__)


@app.route('/login', methods=['GET', 'POST'])
def get_name():
    user = request.json.get('user')
    password = request.json.get('password')
    return 'user is {} password is {}'.format(user, password)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址127.0.0.1:8080/login

4. 接收上传文件

使用request.files参数
run.py

import os
from flask import Flask, render_template, request

# 创建Flask对象
app = Flask(__name__)


# 返回表单页面
@app.route('/form', methods=['GET', 'POST'])
def get_name():
    return render_template('form.html')


@app.route('/upload', methods=['GET', 'POST'])
def get_file():
    picture = request.files.get('picture')
    if picture:
        upload_path = 'static/upload'
        full_path = os.path.join(os.path.dirname(__file__), upload_path, picture.filename)
        picture.save(full_path)
    return 'success'


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

form.html
上传文件,一定要添加 enctype="multipart/form-data"

<!DOCTYPE html>
<html lang="en">
<script src="../static/js/myjavascript.js" type="application/javascript"></script>
<link rel="stylesheet" href="../static/css/mystyle.css">
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
</head>
<body>
<form action="upload" method="POST" enctype="multipart/form-data">
    <input type="file" name="picture">
    <input type="submit" value="提交">
</form>
</body>
</html>

测试,测试地址127.0.0.1:8080/form




11. abort函数的使用

引入from flask import abort
使用方法

  1. 传递状态码信息,必须是标准的http状态码
  2. 传递响应体信息
    run.py
from flask import Flask, abort

# 创建Flask对象
app = Flask(__name__)


@app.route('/abort')
def get_name():
    return abort(500)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址127.0.0.1:8080/abort

run.py

from flask import Flask, abort, Response

# 创建Flask对象
app = Flask(__name__)


@app.route('/abort')
def get_name():
    resp = Response('abort function')
    return abort(resp)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址127.0.0.1:8080/abort

12. 自定义错误信息

run.py

from flask import Flask, abort, Response

# 创建Flask对象
app = Flask(__name__)


# 自定义错误处理方法
@app.errorhandler(404)
def handle_404_error(err):
    return '请求出错了,错误信息{}'.format(err)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址127.0.0.1:8080/aaaaaa

13. 返回json数据的方法

引入from flask import jsonify
run.py

from flask import Flask, jsonify

# 创建Flask对象
app = Flask(__name__)


@app.route('/index')
def get_name():
    return jsonify({'status': '200', 'msg': 'success'})


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址127.0.0.1:8080/index

14. cookie的使用

  1. 设置cookie
    设置cookie,通过response.set_cookie。以下是几个参数:

    • key:设置的cookie的key。
    • value:key对应的value。
    • max_age:改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期。
    • expires:过期时间,应该是一个datetime类型。
    • domain:该cookie在哪个域名中有效。一般设置子域名,比如cms.example.com。
    • path:该cookie在哪个路径下有效。
      run.py
from flask import Flask, make_response

# 创建Flask对象
app = Flask(__name__)


@app.route('/index')
def get_name():
    # 通过make_response创建response对象
    resp = make_response('success')
    # 设置cookie,同时设置cookie的有效期,参数为max_age,单位为秒
    resp.set_cookie('user', 'kun', max_age=1800)
    return resp


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址127.0.0.1:8080/index


可以看出已经成功设置cookie了

  1. 获取cookie
    使用request.cookie获取
    run.py
from flask import Flask, request, make_response

# 创建Flask对象
app = Flask(__name__)


@app.route('/index')
def get_name():
    # 通过make_response创建response对象
    resp = make_response('success')
    # 设置cookie,同时设置cookie的有效期,参数为max_age,单位为秒
    resp.set_cookie('user', 'kun', max_age=1800)
    return resp


@app.route('/info')
def get_cookie():
    user = request.cookies.get('user')
    return 'get cookie, user is {}'.format(user)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址127.0.0.1:8080/info


重新打开一个无痕浏览器的窗口,再次测试

15. session的使用

run.py

from flask import Flask, request, make_response, session

# 创建Flask对象
app = Flask(__name__)
# 可以设置秘钥
app.config['SECRET_KEY'] = 'abcdefghijklmnopqrstuvwxyz123456789'


@app.route('/index')
def get_name():
    session['user'] = 'kun'
    session['sex'] = 'male'
    return 'success'


@app.route('/info')
def get_cookie():
    user = session.get('user')
    sex = session.get('sex')
    return 'get session, user is {}, sex is {}'.format(user, sex)


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

测试,测试地址127.0.0.1:8080/index


16. 上下文对象

请求上下文request context,包括requestsession
应用上下文 application context, 包括current_app, g

17. 请求钩子

在客户端和服务器端交互的过程中,有些准备工作或者扫尾工作需要处理
常用的钩子:

  • before_first_request:在第一次请求之前运行,用途连接数据库
  • before_request: 在每一次请求之前运行,用途权限校验
  • after_request:在请求之后运行,接收一个参数,这个参数时返回的相应数据

run.py

from flask import Flask

# 创建Flask对象
app = Flask(__name__)
# 可以设置秘钥
app.config['SECRET_KEY'] = 'abcdefghijklmnopqrstuvwxyz123456789'


# 在第一次请求之前运行
@app.before_first_request
def before_first_request():
    print('before_first_request')


# 在请求之前运行
@app.before_request
def before_request():
    print('before_request')


# 在请求之后运行
@app.after_request
def after_request(response):
    print('after_request')
    return response


@app.route('/index')
def index():
    return 'index'


if __name__ == '__main__':
    app.run(debug=True, port=8080, host='0.0.0.0')

举报

相关推荐

Flask——入门

Flask 入门4:Flask 模板

Flask入门【1】

Flask 快速入门

0 条评论