一. Flask基础(一)

1.Flask启动

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route("/index"):
  4. def index():
  5. return "Hello"
  6. app.run(host="0.0.0.0", port=9527, debug=True)

2.路由

  1. methods = ["GET", "POST", "PUT", "DELETE"]
  2. # 示例:
  3. @app.route("/index", methods=["POAT", "GET"])

3.Response

  1. # 5个返回类型:
  2. # 三剑客
  3. 1. 直接返回字符串 HttpResponse
  4. 2. 返回模板字符串 render_template
  5. 3. 重定向 redirect
  6. # 两个特殊值
  7. 4. 打开并返回文件内容 send_file("文件的路径")
  8. 5. 标准JSON格式的Response jsonify({"name":"Tom"})
  9. Content-type:application/json

4.Request

  1. from flask import request
  1. 1. method # 获取当前请求的 请求方式
  2. 2. url # 获取完整访问路径,包含url参数
  3. 3. path # 获取路由地址
  4. 4. form # 获取FormData中的数据
  5. - to_dict()
  6. - get()
  7. 5. args # 获取url中的参数数据
  8. - to_dict()
  9. - get()
  10. 6. values # 深坑,通常用于查看args和FormData中的数据
  11. 7. json # 请求头中Content-type:application/json数据会存放在request.json中
  12. 8. data # 请求头中Content-type不被认可时,会将原始的请求体中的数据存放成Bytes类型的数据,Content-type:application/json也会保存原始请求体信息

5.Jinja2

  1. {{}} # 变量,函数
  2. {%%} # 逻辑代码

6.session

  1. from flask import session # 导入session
  2. app.secret_key = "~!@#$%^" # 设置反序列化秘钥
  3. session["user"] = "value" # 添加一个session值

Flask会将序列化后的session字符串存放在客户端的cookies中.

二.Flask基础(二)

1.路由配置

  1. @app.route()装饰器中的参数:
  2. methods
  3. endpoint
  4. defaults
  5. strict_slashes
  6. redirect_to
  7. subdomain

(1)methods

描述: 允许进入当前视图函数的请求方式.

  1. @app.route("/index", methods=["GET", "POST"])
  2. def index():
  3. return "index"

注意: 不写methods参数时默认是只允许GET请求, 写methods参数时要指定所有允许的请求方式, 默认方式会被methods覆盖.

(2)endpoint

描述: 反向url地址,默认为视图函数名, url_for利用它进行反向解析.

  1. from flask import Flask, url_for
  2. @app.route("/info", methods=["GET", "POST"], endpoint='s_info')
  3. def stu_info():
  4. print(url_for('s_info')) # 利用s_info反向解析本视图函数的路由地址 /info
  5. return "student info"

注意: endpoint默认与视图函数名一致, 不写endpoint参数则使用视图函数名反向解析, 即url_for('stu_info'), 有endpoint参数则使用该参数进行反向解析.

(3)defaults

描述: 视图函数的参数默认值.

  1. @app.route("/info", methods=["GET", "POST"], defaults={"nid": 100})
  2. def stu_info(nid):
  3. print(nid) # 100
  4. return "student info"

注意: 视图函数一定要接收这个参数, 且形参名称一定要与defaults参数中的key保持一致.

(4)strict_slashes

描述: 是否严格遵守URL地址规则, 若strict_slashes=True, 那么在url地址末尾不可以出现斜杆/, 反之则可以.

(5)redirect_to

描述: 永久重定向

  1. # 访问地址: /info 浏览器跳转至 /infos
  2. @app.route("/info", redirect_to="/infos")
  3. def student_info():
  4. return "Hello info"
  5. @app.route("/infos")
  6. def student_infos():
  7. return "Hello infos"

注意: 在跳转之前进行重定向, 原url对应的视图函数没有执行, 立即跳转到新的url, 且使用一次后浏览器会有缓存.

(6)subdomain

描述: 子域名前缀 subdomian="car" 这样写可以得到 car.oldboy.com 前提是app.config["SERVER_NAME"] = "oldboy.com"

  1. app.config["SERVER_NAME"] = "oldboy.com"
  2. @app.route("/info",subdomain="car")
  3. def student_info():
  4. return "Hello info"
  5. # 访问地址为: car.oldboy.com/inf

2.动态路由参数

实例1

  1. from flask import Flask, url_for
  2. app = Flask(__name__)
  3. @app.route("/info/<int:nid>", methods=["GET", "POST"], endpoint="s_info")
  4. def student_info(nid):
  5. print(nid, type(nid)) # 1 <class 'int'>
  6. print(url_for("s_info", nid=nid)) # /info/1
  7. print(url_for("s_info", nid=2)) # /info/2
  8. return "Hello info"
  9. app.run()
  10. # 访问地址: http://127.0.0.1:5000/info/1 可以
  11. # 访问地址: http://127.0.0.1:5000/info/e 报错

实例2

  1. from flask import Flask, url_for
  2. app = Flask(__name__)
  3. @app.route("/info/<string:nid>", methods=["GET", "POST"], endpoint="s_info")
  4. def student_info(nid):
  5. print(nid, type(nid)) # 1 <class 'str'>
  6. return "Hello info"
  7. app.run()
  8. # 访问地址: http://127.0.0.1:5000/info/1 可以
  9. # 访问地址: http://127.0.0.1:5000/info/e 可以

实例3

  1. from flask import Flask, url_for
  2. app = Flask(__name__)
  3. @app.route("/info/<nid>", methods=["GET", "POST"], endpoint="s_info")
  4. def student_info(nid):
  5. print(nid, type(nid)) # 1 <class 'str'>
  6. return "Hello info"
  7. app.run()
  8. # 访问地址: http://127.0.0.1:5000/info/1 可以
  9. # 访问地址: http://127.0.0.1:5000/info/e 可以

总结

通过以上示例发现, <int:nid>就是在url后定义一个参数接收url中的参数, 当定义int类型时只能传数字, 当定义string类型时可以接收数字和字符串, 当不定义类型时, 默认是string类型.

注意: 这种动态参数路由, 在url_for的时候, 一定要将动态参数名+参数值添加进去, 否则会抛出参数错误的异常.

3.Flask实例化配置

  1. app = Flask(__name__, )

实例化对象时的参数如下:

  1. # 常用:
  2. template_folder="templates" # 默认模板存放目录 templates
  3. static_folder="static" # 默认静态文件存放目录 static
  4. static_url_path="/static" # 访问静态文件路由地址,默认是"/"+static_folder
  5. # 不常用:
  6. static_host=None # 指定静态文件服务器地址
  7. host_matching=False # 若不是特别需要时,慎用,否则所有的route 都需要host=""的参数
  8. instance_path=None # 指向另一个Flask实例的路径
  9. root_path=None # 主模块所在的目录的绝对路径,默认项目目录

4.Flask对象配置

Flask对象即Flask的实例化对象app, Flask的对象配置就是在 app.config 中添加键值对, 例如, app.config["SECRET_KEY"]="/wrwfgs", 但是你存进去的键必须是config中应该存在的, 如果不存在的话, 它没有任何用处, 所以我们来看一下config中有哪些key以及对应的作用.

  1.   'DEBUG': False, # 是否开启Debug模式
  2.   'TESTING': False, # 是否开启测试模式
  3.   'SECRET_KEY': None # 在启用Flask内置Session的时候/开启flash,一定要有它
  4.   'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默认31天
  5.   'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字
  6.   'PROPAGATE_EXCEPTIONS': None, # 异常传播(是否在控制台打印LOG) 当Debug或者testing开启后,自动为True
  7.   'PRESERVE_CONTEXT_ON_EXCEPTION': None, # 一两句话说不清楚,一般不用它
  8.   'SECRET_KEY': None, # 之前遇到过,在启用Session的时候,一定要有它
  9.   'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默认31天
  10.   'USE_X_SENDFILE': False, # 是否弃用 x_sendfile
  11.   'LOGGER_NAME': None, # 日志记录器的名称
  12.   'LOGGER_HANDLER_POLICY': 'always',
  13.   'SERVER_NAME': None, # 服务访问域名
  14.   'APPLICATION_ROOT': None, # 项目的完整路径
  15.   'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字
  16.   'SESSION_COOKIE_DOMAIN': None, # 在哪个域名下会产生session记录在cookies中
  17.   'SESSION_COOKIE_PATH': None, # cookies的路径
  18.   'SESSION_COOKIE_HTTPONLY': True, # 控制 cookie 是否应被设置 httponly 的标志,
  19.   'SESSION_COOKIE_SECURE': False, # 控制 cookie 是否应被设置安全标志
  20.   'SESSION_REFRESH_EACH_REQUEST': True, # 这个标志控制永久会话如何刷新
  21.   'MAX_CONTENT_LENGTH': None, # 如果设置为字节数, Flask 会拒绝内容长度大于此值的请求进入,并返回一个 413 状态码
  22.   'SEND_FILE_MAX_AGE_DEFAULT': 12, # hours 默认缓存控制的最大期限
  23.   'TRAP_BAD_REQUEST_ERRORS': False,
  24.   # 如果这个值被设置为 True ,Flask不会执行 HTTP 异常的错误处理,而是像对待其它异常一样,
  25.   # 通过异常栈让它冒泡地抛出。这对于需要找出 HTTP 异常源头的可怕调试情形是有用的。
  26.   'TRAP_HTTP_EXCEPTIONS': False,
  27.   # Werkzeug 处理请求中的特定数据的内部数据结构会抛出同样也是“错误的请求”异常的特殊的 key errors 。
  28.   # 同样地,为了保持一致,许多操作可以显式地抛出 BadRequest 异常。
  29.   # 因为在调试中,你希望准确地找出异常的原因,这个设置用于在这些情形下调试。
  30.   'EXPLAIN_TEMPLATE_LOADING': False, # 如果这个值被设置为True,你只会得到常规的回溯。
  31.   'PREFERRED_URL_SCHEME': 'http', # 生成URL的时候如果没有可用的 URL 模式话将使用这个值
  32.   'JSON_AS_ASCII': True,
  33.   # 默认情况下 Flask 使用 ascii 编码来序列化对象。如果这个值被设置为 False ,
  34.   # Flask不会将其编码为 ASCII,并且按原样输出,返回它的 unicode 字符串。
  35.   # 比如 jsonfiy 会自动地采用 utf-8 来编码它然后才进行传输。
  36.   'JSON_SORT_KEYS': True,
  37.   # 默认情况下 Flask 按照 JSON 对象的键的顺序来序来序列化它。
  38.   # 这样做是为了确保键的顺序不会受到字典的哈希种子的影响,从而返回的值每次都是一致的,不会造成无用的额外 HTTP 缓存。
  39.   # 你可以通过修改这个配置的值来覆盖默认的操作。但这是不被推荐的做法因为这个默认的行为可能会给你在性能的代价上带来改善。
  40.   'JSONIFY_PRETTYPRINT_REGULAR': True,
  41.   'JSONIFY_MIMETYPE': 'application/json',
  42.   'TEMPLATES_AUTO_RELOAD': None,
  1. """
  2. 查看所有配置项:
  3. app.default_config
  4. """

以上这些key都可以被改写, 当然它们也有默认值, 如果没有特殊情况, 不要改写它的默认值.

除了单独修改某一项的配置外, 还可以通过类的方式导入配置:

  1. # 新建settings.py文件
  2. class MyConfig(object):
  3. DEBUG = True
  4. SECRET_KEY = "~!@#$%^"
  5. SESSION_COOKIE_NAME = "flask_session"
  1. # 在flask启动文件中加载配置项
  2. from flask import Flask
  3. app = Flask(__name__)
  4. from settings import MyConfig # 导入配置文件
  5. app.config.from_object(MyConfig) # 加载配置文件

5.特殊装饰器

描述: 类似于Django的中间件.

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.before_request
  4. def be1():
  5. print('我是be1')
  6. @app.before_request
  7. def be2():
  8. print('我是be2')
  9. @app.before_request
  10. def be3():
  11. print('我是be3')
  12. @app.after_request
  13. def af1(response):
  14. print('我是af1')
  15. return response
  16. @app.after_request
  17. def af2(response):
  18. print('我是af2')
  19. return response
  20. @app.after_request
  21. def af3(response):
  22. print('我是af3')
  23. return response
  24. @app.route('/index')
  25. def index():
  26. print('我是视图函数')
  27. return 'ok'
  28. if __name__ == '__main__':
  29. app.run(debug=True)
  1. # 总结:
  2. before_request # 在请求进入视图函数之前作出响应
  3. after_request # 在视图函数处理之后,响应返回客户端之前
  4. # 代码书写顺序:
  5. be1 -> be2 -> be3 -> view -> af1 -> af2 -> af3
  6. # 代码执行顺序:
  7. 正常情况: 返回顺序是书写代码时的倒序
  8. be1 -> be2 -> be3 -> view -> af3 -> af2 -> af1
  9. 异常情况: 异常阻塞请求的情况,不经过视图函数
  10. be1 -> af3 -> af2 -> af1

6.重定义错误提示errorhandler

  1. from falsk import Flask, render_template
  2. app = Flask(__name__)
  3. @app.errorhandler(404) # 参数是错误码
  4. def error404(error_msg): # 必须接收错误信息
  5. print(error_msg)
  6. return render_template("error404.html")
  7. if __name__ == "__main__":
  8. app.run()

7.before_first_request

  1. @app.before_first_request # 当前客户端第一次访问此应用(不会被阻塞)
  2. def bfe():
  3. print("当前客户端第一次访问此应用")
  4. return "ok"

8.Flask蓝图(Blueprint)

实例一

初学flask, 可以将蓝图理解为没有run方法的Flask对象.

  1. # 新建flask_project/app01/views.py
  2. from flask import Blueprint # 导入蓝图
  3. bp1 = Blueprint("bp1", __name__) # 实例化蓝图对象
  4. @bp1.route("/stulist")
  5. def stulist():
  6. return "student list"
  1. # 新建flask_project/manage.py
  2. from flask import Flask
  3. from app01 import views
  4. app = Flask(__name__)
  5. app.register_blueprint(views.bp1) # 注册蓝图
  6. if __name__ == "__main__":
  7. app.run(debug=True)

运行manage.py文件启动flask项目, 浏览器访问http://127.0.0.1:5000/stulist即可看到返回结果.

蓝图可以指定url前缀(url_prefix参数), 有如下两种方法:

  • 方法一: 实例化蓝图对象时指定url前缀

      1. bp1 = Blueprint("bp1", __name__, url_prefix="app01")
  • 方法二: 在注册蓝图时指定url前缀

      1. app.register_blueprint(views.bp1, url_prefix="app01")

此时, 浏览器访问http://127.0.0.1:5000/app01/stulist可看到返回结果.

实例二

  1. # app01/views/user.py
  2. from flask import Blueprint
  3. user_bp = Blueprint("user", __name__, url_prefix="/app01")
  4. @user_bp.route("/user")
  5. def user():
  6. return "I am user Blueprint"
  1. # app01/__init__.py
  2. from flask import Flask
  3. from app01.views.user import user_bp
  4. def create_app01():
  5. app01 = Flask(__name__)
  6. app01.register_blueprint(user_bp)
  7. return app01
  1. # manager.py
  2. from app01 import create_app01
  3. my_app01 = create_app01()
  4. if __name__ == '__main__':
  5. my_app01.run(host="0.0.0.0", port=5000, debug=True)

三.蓝图实例演练

基于蓝图实现一个内存增删改查, 数据如下:

  1. STUDENT_DICT = {
  2. 1: {'name': 'Old', 'age': 38, 'gender': '中'},
  3. 2: {'name': 'Boy', 'age': 73, 'gender': '男'},
  4. 3: {'name': 'EDU', 'age': 84, 'gender': '女'},
  5. }

待续...

flask(2.0)的更多相关文章

  1. Airflow安装异常:ERROR: flask-appbuilder 1.12.3 has requirement Flask<2,>=0.12, but you'll have flask 0.11.1 which is incompatible.

    1 详细异常: ERROR: flask-appbuilder 1.12.3 has requirement Flask<2,>=0.12, but you'll have flask 0 ...

  2. [Python] Flask从0到1开发轻量级网页

    概述 Flask采用MVT模型,即Model, Template, View Model:定义数据的存储格式,并且提供了数据库访问的API View:定义那些数据被显示,是业务逻辑处理模块 Templ ...

  3. [py]flask从0到1-模板/增删改查

    flask知识点 1.后端渲染html到前端 render_template 2.后端获取前端数据 request.args.get 3.前端获取后端数据 模板 4.警示消息 flash {{ get ...

  4. flask(3.0)

    目录 一.Flask - CBV 二.Flask - Session 1.安装flask-session 2.回顾flask自带的session的使用方法 3.flask-session的使用(以保存 ...

  5. flask(1.0)

    目录 一. 关于KeyError和IndexError 二. Python三大主流框架对比 三. flask基础 1.安装flask 2.用flask写出的第一个页面 3.Flask的Response ...

  6. Flask:操作SQLite3(0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 本文介绍了第一次在Flask框架中操作SQLite3数据库的测试,参考了官网的文档Using SQLite 3 wit ...

  7. Flask:cookie 和 session (0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 Cookie是什么?有什么用? 某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常 ...

  8. Flask:静态文件&模板(0.1)

    Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 前面看了Flask的Quickstart文档,可是,一直没有练习里面的内容,这不,刚刚练习完毕,来写篇博文记录一下! ...

  9. Flask 发布 1.0 稳定版

    简评:现在都开始版本大跃进了吗?对,别看别人,说的就是你 pipenv(名单太长,待补齐...) Flask 其实早就已经十分稳定了,而在第一个 commit 大概 8 年之后,版本号才最终反映出了这 ...

随机推荐

  1. TODO redis学习笔记

    redis官网教程地址:http://try.redis.io/ redis脚本和命令部分来自:https://www.runoob.com/redis/redis-security.html red ...

  2. ext系统的超级块

    什么是超级块 如果说inode块是Linux操作系统中文件的核心,那么超级块就是文件系统的心脏.启动Lnux操作系统后,发现某个文件系统无法使用,很有 可能就是超级块出现了问题.为什么这个超级块有这么 ...

  3. C sizeof函数

    #include<stdio.h> int main() { struct stu { union { ]; ]; } cls; ]; float cj; } xc; printf(&qu ...

  4. RestTemplate发送GET请求

    import org.springframework.web.client.RestTemplate; @Component @Slf4j public class JsSdkUtil { /** * ...

  5. Java项目出现的问题--实际项目01

    1   从Excel中导入指纹图谱数据异常 在导入指纹图谱时对Excel的规范是有限制的,有时候报空指针异常是因为虽然有些地方看起来没有内容但是可能有空格键:解决方法是新建一个Excel表,把要用到的 ...

  6. siblings([expr])

    siblings([expr]) 概述 取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合.可以用可选的表达式进行筛选.大理石平台维修   参数 exprStringV1.0 用于筛选 ...

  7. QueryList之flatten方法

    正确用法: $data = $ql->get($url)->query()->getData();$data = $data->flatten()->all(); 注意: ...

  8. BZOJ 1097: [POI2007]旅游景点atr 状态压缩+Dijkstra

    题解: $k<=20,$ 考虑状压dp. 从 $1$ 号点走到 $n$ 号点经过的点的个数可能会非常多,但是强制要求经过的点一共才 $20$ 个. 而我们发现这个题好就好在可以经过某个城市,而不 ...

  9. linux系统编程--线程

    安装线程man page,命令:sudo apt-get install manpages-posix-dev 线程概念 什么是线程 LWP:light weight process 轻量级的进程,本 ...

  10. C和汇编混联合的问题

    关键时刻出现了问题: 关于packed的问题,一定要注意这个问题http://stackoverflow.com/questions/4306186/structure-padding-and-str ...