Flask入门

作者: 鹊南飞_ | 来源:发表于2020-01-16 17:56 被阅读0次

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

get请求
测试,测试地址http://127.0.0.1:8080,请求方式post
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的使用

在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用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的使用

session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些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. 上下文对象

  1. Flask中上下文对象:相当于一个容器,保存了Flask程序运行过程中的一些信息
  2. Flask中有两种上下文:请求上下文request context和应用上下文 application context
  3. appliacation的生命周期大于request。一个application存活期间可能发生多次http请求,所以也就会有多个request

请求上下文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入门

    本文链接:https://www.haomeiwen.com/subject/ywafzctx.html