一文看懂轻量级框架——Flask

Flask

一、flask入门

WEB工作原理

  1. C/S 客户端/服务器端
  2. B/S 浏览器/服务器端

Flask有俩大核心

  1. werkzeug

    实现路由、调试和web服务的网关接口

  2. jinjia2

    实现了模板

简介:

flask 是一个python微型框架 只提供了一个强健的核心 其它功能都需要通过第三方扩展库来实现

安装

pip install flask

完整启动的代码

from flask import Flask
app = Flask(__name__)

# 路由  别人访问你的地址  http://www.baidu.com/a/b
@app.route('/')
def index():
    print('访问到我了')
    # 响应
    return '访问到我了'

# 判断只能在主文件中文件flask项目
if __name__ == '__main__':
    # 运行flask
    app.run()

启动地址

http://127.0.0.1:5000

http://127.0.0.1:5000/

run启动参数

参数 说明
debug 是否开启调试模式 默认为false 开启会自动加载代码 和显示错误信息
threaded 是否开启多线程 默认是不开启的
port 端口号 默认5000
host 主机 默认127.0.0.1

完整的启动

app.run(host=‘0.0.0.0’,port=‘5001’,debug=True,threaded=True)

正常本地调试使用的时候 只需要开启debug就可以 如果发生端口冲突 则开启port

app.run(debug=True)

二、视图函数

(1) 无参路由(没有参数的路由地址)

实例

@app.route('/')
def index():
    # 响应
    return '访问到我了'

(2) 带一个参数的路由

格式

/路由名称/<参数名>/

实例

@app.route('/welcome/<name>/')
def welcome(name):
    return 'welcome {}'.format(name)

访问

http://127.0.0.1/5000/lucky/

(3) 带多个参数的路由

@app.route('/info/<name>/<age>/')
@app.route('/info/<name>_<age>/')
def info(name,age):
    return '我叫:{} 我今年:{}岁了'.format(name,age)

访问:

http://127.0.0.1/5000/lucky/18/

http://127.0.0.1/5000/lucky_18/

(4) 限制路由参数的访问类型

通过 path、string、int、float进行限制

实例

@app.route('/welcome/<arg>/')
@app.route('/welcome/<string:arg>/')  值的类型为字符串 默认就是string
@app.route('/welcome/<int:arg>/')  值的类型必须为整形
@app.route('/welcome/<float:arg>/') 值的类型必须为浮点型
@app.route('/welcome/<path:arg>/') 值的类型因为字符串 只是/分隔符 不再认为是分隔符 而是值的一部分
def welcome(arg):
    print(type(arg))
    return 'welcome {}'.format(arg)

注意:

  1. 一个视图函数 是可以有多个路由名称
  2. 路由结尾的/建议加上 否则会多一次重定向 如果在定义的时候路由结尾没有/ 那么在访问的 时候 路由就不能有 / 否则 404
  3. 参数值的类型默认都为 字符串!!!

flaskday2

三、重定向 redirect

作用:

可以直接通过浏览器跳转到另外一个地址(视图函数直接的跳转)

导入:

from flask import redirect,url_for

  • redirect 通过给定参数路由地址 进行跳转
  • url_for 通过视图函数名称 反向构造出路由地址

redirect的使用
实例

# 使用redirect
@app.route('/redirect/')
def my_redirect():
#     去首页 无参路由
    return redirect('/')
#     带一个参数的路由地址的重定向
    return redirect('/arg/lucky/')
#      带多个参数的路由地址的重定向
    return redirect('/args/lucky/18/')

url_for的使用

实例

# 使用url_for 的视图函数
@app.route('/url_for/')
def my_urlfor():
    # 构造首页路由
    print(url_for('index'))  # /
    # 给url_for 一个带参的视图函数 但是没给参数  会报错werkzeug.routing.BuildError: Could not build url for endpoint 'arg'. Did you forget to specify values ['name']?
    print(url_for('arg'))
    # 带一个参数  给参数
    print(url_for('arg',name='lucky')) #/arg/lucky/
    # 带多个参数的视图函数
    # werkzeug.routing.BuildError: Could not build url for endpoint 'args'. Did you forget to specify values ['age', 'name']?
    print(url_for('args'))
    # 带参数
    print(url_for('args',name='lucky',age=18)) #/args/lucky/18/
    return 'url_for'

redirect和url_for的组合使用

实例

# redirect 和 url_for的组合使用
@app.route('/ru/')
def ru():
    # 去首页
    return redirect(url_for('index'))
    # 去一个参数的路由地址
    return redirect(url_for('arg',name='lucky'))
    # 去多个参数的路由地址
    return redirect(url_for('args',name='lucky',age=18))

四、abort(终止)

导入

from flask import abort

类似python中的raise

上方的代码正常执行 下面的代码不在执行

raise 抛出的错误名称

abort抛出的http状态码

实例

from flask import abort 
@app.route('/test_abort/')
def test_abort():
    print('abort上方')
    abort(500)
    print('abort下方')
    return '测试abort的视图函数'

五、捕获错误

实例

# 捕获状态所对应的错误
# 参数 err 是当前捕获状态码的错误信息
@app.errorhandler(500)
def server_error(err):
    print(err)
    return '你报500的错误了!!!'

@app.errorhandler(404)
def page_not_founde(err):
    print('404了!')
    return '404'

六、请求 request

作用:

获取请求报文中 传递的数据

概述:

浏览器发送到服务器的所有报文被flask接收以后 会创建出request请求对象 request被用于视图函数中 用来获取请求的数据

导入:

from flask import request

request常用属性

  1. url 完整的请求 url
  2. base_url 去掉get传参的url
  3. host_url 只有主机IP和端口号的url地址
  4. host 主机和端口
  5. path 路由地址
  6. method 请求的方法
  7. remote_addr 获取客户端请求的ip地址
  8. args 获取get传参的参数
  9. form 存储form表单传递过来的数据
  10. files 获取文件上传
  11. headers 获取请求头信息
  12. cookies 获取请求的cookie
  13. json 获取请求过来的json数据

实例

# 请求对象 request的使用
# http://127.0.0.1:5000/request/?name=lucky&age=18#name
@app.route('/request/')
def r():
    print(request.url)
    print(request.base_url)
    print(request.host_url)
    print(request.host)
    print(request.path)
    print(request.method)
    print(request.remote_addr)
    print(request.args['name'])
    print(request.args['age'])
    print(request.args.get('name'))
    print(request.args.get('age'))
    print(request.headers.get('User-Agent'))
    return 'request请求对象'

七、响应 response

(1) 直接响应字符串数据

实例

@app.route('/')
def index():
    # 只相应内容
    return 'index'
    # 响应内容和状态码
    return 'index',404

(2) 通过make_response来构造响应

from flask import make_response

实例

@app.route('/')
def index():
    # 手动构造响应
    res = make_response('响应内容')
    # 响应内容和状态码
    res = make_response('响应内容',404)
    return res

八、current_app

导入

from flask import current_app

概述

current_app 是当前app对象的一个代理对象 用于获取实际的app对象和app上的配置信息

实例

# current_app的使用
@app.route('/test_current_app/')
def test_current_app():
    print(current_app.config['SECRET_KEY'])
    return 'test_current_app'

九、会话控制 cookie 的使用

概述

会话控制 用来保持用户的状态

原因:

http协议 是无状态协议 每一次连接都是一个新的会话

cookie值的存储

cookie存储在客户端的浏览器一般会限制存储cookie的个数为 20个 并且单个cookie保存值的大小不能超过4kb

存储在浏览器上为明文存储 所有不安全

(1) 设置cookie

response.set_cookie(key,value,max_age=None,expires=None,path=’/’)

实例

# 设置cookie
@app.route('/set_cookie/')
def set_cookie():
    res = make_response('设置cookie')
    res.set_cookie('name','lucky')
    return res

默认存活时间为浏览会话结束

意思就是关闭浏览器时 就结束(切记 不是关闭标签页)

(2) 获取cookie

实例

# 获取cookie
@app.route('/get_cookie/')
def get_cookie():
    val = request.cookies.get('name','值不存在')  #若有值 则显示,若没有 则显示值不存在
    return val

(3) 删除cookie

实例

# 删除 cookie
@app.route('/delete_cookie/')
def delete_cookie():
    res = make_response('删除cookie')
    res.delete_cookie('name')
    return res

(4) 设置cookie并设置过期时间

实例

# 设置cookie并设置过期时间
@app.route('/set_cookie_expires/')
def set_cookie_expires():
    res = make_response('设置cookie并设置过期时间')
    # 设置cookie存活时间为 1分钟
    # res.set_cookie('name','lucky',max_age=60)
    left_time = time.time()+60
    res.set_cookie('name','lucky',expires=left_time)
    return res

十、会话控制session的使用

服务器需要识别同一个访问者的请求 主要是通过浏览器中的cookie实现的 访问者在第一次访问服务器的时候 会在浏览器的cookie中 存储一个唯一sessionid值 通过这个唯一id值区分不同的访问者的请求

session基于cookie

注意:

设置session 需要添加 secret_key 秘钥 进行sessionid加密生成的字符串

设置secret_key的方法

app.secret_key = 'lucky'
app.config['SECRET_KEY'] = 'lucky'

导入

from flask import session

(1) 设置session

# 设置session
@app.route('/set_session/')
def set_session():
    session['name'] = 'lucky'
    return '设置session'

(2) 获取session

# 获取session
@app.route('/get_session/')
def get_session():
    val = session.get('name','没有值')
    return 'session的值为:{}'.format(val)

(3) 删除session

# 删除session
@app.route('/delete_session/')
def delete_session():
    # 删除某个key的session值
    # session.pop('name')
    # 清除所有session
    session.clear()
    return 'session的key为name的值被删除'

(4) 设置session并设置过期时间

# 设置session并设置过期时间
@app.route('/set_session_leftime/')
def set_session_leftime():
    # 开启session持久化存储
    session.permanent = True
    # timedelta是一个计算时间差值的模块
    app.permanent_session_lifetime = timedelta(minutes=1)
    session['name'] = 'lucky'
    return '设置session并设置过期时间'

区别:

  1. cookie数据存储在浏览器上 session存储在服务器上
  2. cookie 没有session安全
  3. session会在一定时间内保存在服务器上 当访问增多 会加大服务器的压力 考虑性能优化 存储在cookie上
  4. 个人建议 将登陆等重要的数据 存储在sessino上 其它的建议存储在cookie上

十一、flask扩展库 flask-script

概述:

flask终端运行解析器

安装:

pip install flask-script

使用

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)
	...
if __name__ == '__main__':
    manager.run()

启动项参数:

获取启动项参数:

python 文件名.py runserver -?

完整启动

python manager.py runserver -h0.0.0.0 -p5001 -d -r

正常启动

python manage.py runserver -d -r

十二、蓝本 blueprint

概述

当我们代码越来越复杂的时候 很明显将所有视图函数 放在一个文件中 是不合理的 要按照功能进行视图函数的划分

使用 user.py

# user.py 就是所有处理用户的视图函数的py文件
# 导入蓝本文件
from flask import Blueprint
user = Blueprint('user',__name__)

@user.route('/login/')
def login():
    return '登录'

@user.route('/logout/')
def logout():
    return '退出登录'

manager.py

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)

@app.route('/')
def index():
    return 'index'
# 从user蓝本文件 导入user蓝本对象
from user import user
# 注册蓝本
# app.register_blueprint(user)
app.register_blueprint(user,url_prefix='/user')
if __name__ == '__main__':
    manager.run()

访问

http://127.0.0.1:5000/login/

http://127.0.0.1:5000/user/login/

注意:

蓝本之间的重定向 需要告诉url_for 是哪个蓝本文件的视图函数名 否则报错

@app.route('/')
def index():
    # index视图 去 user.py蓝本
    # return redirect('/user/login/')
    # 配合 url_for 需要注意 告诉人家 是哪个蓝本文件的视图函数
    return redirect(url_for('user.login'))

扩展

web框架

其他语言

M model 模型 操作数据库

V view 视图 负责展示模板给用户看的

C controller 控制器 进行逻辑功能与模型和视图的交互

python中

M model 模型 操作数据库

V view 视图 进行逻辑功能与模型和视图的交互

T templates 模板 负责展示模板给用户看的

发布了25 篇原创文章 · 获赞 5 · 访问量 1496

猜你喜欢

转载自blog.csdn.net/weixin_43656359/article/details/103736409