网站建立快捷方式,宁波关键词排名优化平台,网站建设维护服务协议,电商平台总体设计方案Flask第三方组件非常全#xff0c;适合小型 API服务类项目#xff0c;但第三方组件运行稳定性相对Django差。
基础知识
Flask安装
pip install flask2.0.3Flask库文件
Jinjia2#xff1a;模板渲染库Markupsafe#xff1a;返回安全标签 只要Flask返回模板或者标签时都会…Flask第三方组件非常全适合小型 API服务类项目但第三方组件运行稳定性相对Django差。
基础知识
Flask安装
pip install flask2.0.3Flask库文件
Jinjia2模板渲染库Markupsafe返回安全标签 只要Flask返回模板或者标签时都会依赖Werkzeug德文工具 底层是基于 WSGIFlask项目启动都是基于WerkzeugitsDangerous: 安全地对数据进行签名以确保其完整性。用于保护Flask的会话CookieClick用于编写命令行应用程序的框架提供命令并允许添加自定义管理命令
启动Flask
# 导入Flask类创建Flask应用对象
from flask import Flaskapp Flask(__name__)# 为Flask应用添加路由
app.route(/)
def index(): # 与路由绑定的视图函数视图函数名尽可能保持唯一return Hello worldif __name__ __main__:app.run() # 启动Flask应用Flask Response “Hello world” 可直接返回字符串 render_template(“HTML文件”) redirect(“/home”) 重定向到指定路由ResponseHeaders中加入了一个 Locationhttp://url send_file(“文件路径”) 返回文件 打开并识别文件内容自动识别文件类型在ResponseHeaders中加入Content-Type:文件类型这些文件类型是可以被客户端识别的对于不能识别的文件类型作下载处理。 如exe文件x-ms x表示二进制文件 ms表示微软 jsonify(“字符串或者数据类型”) 返回数据类型为Content-Type:application/json
Flask Request request.form获取FormData中的数据可用to_dict()方法转为字典数据类型 request.method获取请求方式 request.args获取url中的数据 request.files获取上传的文件 my_file request.files.get(myfile)
my_file.save(文件保存路径)request.data获取json数据 获取Content-Type:application/json时提交的数据 request.data获取原始请求体中的数据 b Content-Type无法被识别或不包含Form字眼 request.headers request.cookies request.path request.host request.host_url request.url请求地址 request.values接受所有(GET,POST)请求中的数据包含了URL和FormData request.url_charsetURL编码格式 request.url_root请求地址完整的请求地址 host request.url_rule请求路由地址 /index
用户登录demo
Python
from flask import Flask
from flask import render_template
from flask import requestapp Flask(__name__)app.route(/login, methods[GET, POST])
def login():if request.method GET:return render_template(login.html)elif request.method POST:username request.form.get(username)password request.form.get(password)print(username, password)if username jack and password 123456:return {msg: 登陆成功}
if __name__ __main__:app.run(host0.0.0.0, debugTrue)Html
!DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0title用户登录/title
/head
bodybodyform action/login methodpostspan账号 input typetext nameusername/spanbrspan密码 input typetext namepassword/spanbrspaninput typesubmit value登录/span/form/body
/body
/htmlFlask Session
Session服务端的键值对
Cookie客户端的键值对
交由客户端保管机制 开启session[token] “asdfihasdfjhdsfiohoi” {”token: “asdfihasdfjhdsfiohoi”}序列化字典 字符串根据secret_key密钥加密字符串 接受反序列化session 从cookie中获取key为session的值 “eyJ0b2tlbiI6ImFzZGloaWFzZGhhc2RpdWhhaXNkaCJ9.Y3Oe1w.yWmRzkZcJXKM1IeVYfF97mCgpz4”通过secret_key解密 session反序列化成字典 from flask import Flask
from flask import render_template
from flask import requestapp Flask(__name__)
app.secret_key $^%%%#$%^* # 设置密钥如果不设置密钥使用session会报错app.route(/login, methods[GET, POST])
def login():if request.method GET:return render_template(login.html)elif request.method POST:username request.form.get(username)password request.form.get(password)print(username, password)if username jack and password 123456:session[token] asdihiasdhasdiuhaisdhreturn redirect(/)app.route(/)
def index():token session.get(token)return Hello worldif __name__ __main__:app.run(host0.0.0.0, debugTrue)Flask Jinja2 {{ }} 引用变量数据 执行函数 {% %} 逻辑代码 for循环 {% for item in items %}# 逻辑代码
{% endfor %}if 判断 {% if 判断条件 %}# 逻辑代码
{% else %}# 逻辑代码
{% endif %}from flask import Flask
from flask import render_templateapp Flask(__name__)def fun():return 水花兄弟!app.route(/name)
def user():users [{name: 库里, age: 34, gender: 男},{name: 汤普森, age: 32, gender: 男},{name: 格林, age: 31, gender: 男}]return render_template(user.html, usersusers, funfun)if __name__ __main__:app.run(host0.0.0.0, debugTrue)!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
bodytabletrtdname/tdtdage/tdtdgender/td/tr{% for user in users %}trtd{{ user.name }}/tdtd{% if user.age 32 %}{{ fun() }}{% else %}{{ user.age }}{% endif %}/tdtd{{ user.gender }}/td/tr{% endfor %}/table
/body
/html注意 变量为dict类型时可用key.value、dict[key]或者dict.get(key)获取值函数可作为变量传入后调用 Flask 路由参数
route()中的参数 endpoint不能重复对应视图函数 默认是视图函数名 视图函数与路由对应关系 url_for 反向创建url methods 允许亲求的方式 [GET, POST, DELETE, PUT] redirect_to 永久重定向 没有进入视图直接跳转 strict_slashes 是否严格要求路由匹配规则 为True时“/url/“是不被允许的只允许”/url” 为False时/url/“和”/url都可以 default{nid: 123} 默认参数视图函数中func(nid)一定要接受传参
动态路由参数
接收多个参数
app.route(/pages/int:page_int:row)
def pages(page, row):print(page, row)return 200 okFlask实例化配置
template_folder模板存放路径默认为templatesstatic_folder静态文件存放路径默认值为staticstatic_url_path静态文件访问路径默认值为/staticstatic_host静态文件访问服务HOST 指向到另一台服务器
from flask import Flaskapp Flask(__name__,template_foldertemplates,static_folderstatic,static_url_path/static,static_hostxxxxx
)Flask对象Config配置
DEBUG模式开启编辑时代码重启Log打印级别最低错误信息透传
app.config[DEBUG] TrueTESTING模式无限接近生产环境代码编辑不会重启Log级别较高错误信息不再透传
app.config[TESTING] FalseSESSION_COOKIE_NAME浏览器中session的名称第一个字符不能是空格
app.config[SESSION_COOKIE_NAME] sessionFlask Config快速配置
class DebugConfig:DEBUG TrueSECRET_KEY asdhugoiasd^%$$#$%#^%7from settings import DebugConfigapp Flask(__name__)
# app.secret_key $^%%%#$%^*
app.config.from_object(DebugConfig)Flask 蓝图 BluePrint
蓝图作用功能隔离路由隔离
新建app01文件夹下新增views.py文件、templates、static文件夹等
url_prefix表示URL前缀用于隔离相同URL
user表示蓝图名称不能重复保证在app中是唯一的
template_folder默认是最外层项目templates如需设置内部文件夹则template_folderapp01/templates
# views.py
# 蓝图
from flask import Blueprint# BluePrint 当作一个不能够run的Flask
user Blueprint(user, __name__, url_prefix/user)user.route(/login)
def login():return I am userBP在app.py中注册蓝图
from flask import Flaskapp Flask(__name__)from app01.views import user
# 注册蓝图
app.register_blueprint(user)if __name__ __main__:app.run()浏览器中访问app01的login视图http://127.0.0.1:5000/user/login
Flask特殊装饰器 app.before_request 请求进入视图函数之前 app.after_request请求结束返回响应时 正常before_request1 before_request2 视图函数 after_request2 after_request1 异常before_request1 after_request2 after_request1 app.errorhandler(4xx or 5xx)重定义错误信息 app.errorhandler(404)
def error(error_message):print(error_message)# return f你访问的{}不存在.format(request.path) # 自定义信息# return redirect(www.baidu.com) # 重定向return send_file(文件路径) # 返回图片或者其他文件Flask CBV
from flask import Flaskapp Flask(__name__)app.route(/) # FBV
def index():return asbdjfrom flask import viewsclass Index(views.MethodView):def get(self):return GET 200 OKdef post(self):return POST 201 OKdef put(self):return PUT 200 OKdef delete(self):return DELETE 200 OK# 注册路由
app.add_url_rule(/user, view_funcIndex.as_view(nameuser))if __name__ __main__:app.run(debugTrue)监听 端口
0.0.0.0监听ip地址
端口 - 监听应用程序
包到应用程序的过程 IOS 5层中的最高层 ——————- 应用 服务器接收到数据浏览器-9528 bHTTP 1.1 /GET\r\n 192.168.14.25:9527 网卡 操作系统 操作系统 解包 - 端口9527 - 收到 bHTTP 1.1 /GET\r\n Flask - WSGI 把数据转换成 environ对象请求原始数据对象几乎接近于request对象 Flask 接收到 WSGI 转换的environ对象 request_class Flask Request 样式 Flask request对象如request.form Flask-Session第三方组件 交由客户端保管机制 - 安全性相对较差 Cookie原生Session优势是不占用服务器空间Flask-Session - DjangoSession相对一样的数据redis在内网中使用不要放在公网 # 蓝图
from flask import Blueprint
from flask import session# BluePrint 当作一个不能够run的Flask
user Blueprint(user, __name__, url_prefix/user)user.route(/login)
def login():session[user] asdugaiushduyhreturn I am userBPuser.route()
def index():print(session[user])return sessionfrom flask import Flask
from flask_session import Session
from redis import Redisfrom app01.views import userapp Flask(__name__)
app.secret_key asdhiuh989
app.config[SESSION_TYPE] redis
app.config[SESSION_REDIS] Redis(host106.15.**.**, port6379, password******)
# 配置之后
Session(app)
# 蓝图之前
app.register_blueprint(user)if __name__ __main__:app.run()Flask请求上下文 该部分主要是阅读源码 线程安全 极快解决阻塞问题保证公共对象的安全性缺点是非常耗费内存空间换时间 import time
from copy import deepcopy
from threading import Thread, get_identclass Foo:passlocal_dict {}f Foo()
f.num 0def add_(i):local_dict[get_ident()] deepcopy(f)local_dict[get_ident()].num itime.sleep(1)print(local_dict[get_ident()].num)for i in range(20):task Thread(targetadd_, args(i,))task.start()import time
from threading import Thread, localclass Foo(local):passf Foo()f.num 0def add_(i):f.num itime.sleep(1)print(f.num)for i in range(20):task Thread(targetadd_, args(i,))task.start()相对使用线程ID保存数据的方式使用local占用资源更少 偏函数将原函数和原函数接收的参数一并返回新函数在执行新函数时将参数传入原函数中一并执行。 from functools import partialdef abfunc(a, b, c):return a b cnew_fum partial(abfunc, c88)print(new_fum(6, 7))OOP 面向对象 熟悉掌握相关魔法方法以及重写如__setitem__、__getitem__等
Web socket