flask笔记

2023-11-14

python中的web框架

a:socket服务端 b:路由转发 c:模板渲染

  • Django(同步框架)
    • a:用的别人的,bc自己写的
  • Flask (同步框架)
    • a:用的别人的,b自己写的,c用的别人的(jinja2)
  • Tornado (异步框架)
    • abc都是自己写的
  • Sanic(可能会火,异步框架) 3.5以后支持,不支持windows

实现了wsgi协议的web服务器

wsgi协议(本质就是一个socket服务端):uwsgi,wsgiref

java中的web服务器:tomcat,jboss

cgi:通用网关协议,跟语言没有关系

flask:基于Python开发,依赖jinja2模板(c用的别人的),和werkzeug wsgi服务器(本质是socket服务端)的微型框架,werkzeug wsgi服务器接收http请求,然后触发flask框架。

werkzeug是一个工具包,里面实现了wsgi协议,werkzeug不是一个web服务器,也不是web框架,就是一个包,里面还有其他别的东西,可以作为web框架的底层库。

flask的路由是基于装饰器的,装饰器的执行过程:如果装饰器语法糖没有括号(没有参数),就把装饰器下面的函数当做参数传给装饰器去执行,返回结果。如果有括号,先执行,然后返回一个函数fun的内存地址,接着把被装饰函数放入当做参数放入该函数fun中,返回结果。

反向代理:找中介买房,多个客户端发送请求,反向代理(一个服务器)接收请求,决定请求要去哪个服务器。

正向代理:找黄牛买票,翻墙,在客户端和服务端中间,接收客户端请求,让正向代理去访问请求的服务器

读过的django源码,工作中碰到的问题,

1、django request.post源码,碰到request.post出来的字典不能修改的问题

  • request.post是一个querydict, querydict继承MultiValueDict,而MultiValueDict继承字典,拥有字典的方法。multivaluedict的值是一个列表,形式例如:{'a':[1,2,3]},用get方法只能拿到第一个值1,用getlist拿到所有值。
  • querydict有一个最大特点:不支持修改,让中间件不能修改。
    • 源码:querydict的双下setitem写了个断言,如果修改了就抛出异常
    • 想修改,如何修改?request.post.dict一下,dict()方法会通过字典生成式返回一个新字典,通过新字典修改。

2、自己写orm框架的时候,将字段对象存进mapping后,忘了删除原来名称空间中的字段名,如果不删,后面取字段值的时候会打印出一个field对象而不是一个值。

2、元类object源码:

  • 元类里面有__ call __,这就是类可以调用的原因。对象要想调用,类中必须实现call, 类要想调用,元类实现call,
  • object没有 __ call __ 方法

jinja2有没有处理XSS攻击?

  • 处理了,怎么处理的?html中的特殊符号,Markup('标签字符串') 通过函数传到模板页面处理

jinja2模板语言

  • 支持函数加括号并传参,其他的用法完全通DTL
  • 有没有处理XSS攻击,处理了
    • 处理XSS攻击:html中的特殊符号
    • 模板中处理:{{ss|safe}}
    • 视图中用:ss = Markup(ss)

请求响应:

  • request请求:
    • 多个请求同时发出,为什么没有乱
    • request.args GET请求的数据
    • request.form POST请求的数据
    • request.values GET和POST的数据
  • response响应
    • return 字符串
    • return render_template()
    • return redirect
    • return jsonify({})
    • make_response模块
      • obj = make_respones()
      • obj.set_cookie
      • obj.delete_cookie
      • obj.header['key'] = value

session

  • cookie,session , token,jwt是什么?
    • 首先http无状态,无法保存用户状态,要用到登录保存状态怎么办,就需要一个东西将不同请求连接起来
    • 由于无状态性为了使域名下的所有页面连接起来,出现了cookie和session
    • session:服务端接收请求建立session,将session返回给客户端成为cookie。服务端需要存储session占用空间。服务器采用分布式或集群多服务器时,在多服务器的情况下,因为多服务器不共享session,不好确认当前用户是否登录。当然你也可以将所有session集中在一个服务器,但是不能完全达到负载均衡的效果。这时候就需要使用token。
    • cookie:存在于客户端的键值对,所有键值对都放在客户端,不安全,十万个用户的cookie都放在客户端费资源
    • token类似一个令牌,所有用户信息都被加密到token中,服务端收到token就能解密,知道是哪个用户。客户端每次访问都传递token,服务端解密token。服务端就不需要存储session占用空间,也可以解决分布式和集群的问题。
    • jwt就是一个加密字符串,作为验证信息在计算机之间进行传递。jwt是一个跨域验证的方案。
  • session使用前必须先设置一个秘钥:
    • app.secret_key = 'aasdfasdfasdf'
    • 放值取值:session['name'] = 'zjy'
  • cookie:
    • expires, max_age设置cookie超时时间
    • domain cookie生效的域名
    • path cookie生效的路径
    • secure=False 浏览器只能通过http回传cookie
    • httponly=False 只能http协议传输,无法通过js获取cookie,但不是绝对,底层抓包也能获取。
  • 第三方插件flask-session 干了什么事
    • 不想让session数据放在cookies中,把数据放在mysql中,redis中
    • app.session_interface = 我自己写的类
    • 必须实现save_session, open_session ,这就是插件干的事情。
      • save_session 就把session保存到了数据库中
  • 源码执行流程:
    • save_sesion:响应的时候,把session中的值加密序列化放到了cookie中,返回到浏览器
    • open_session:请求来了,从cookie中取出值,反解,再生成session对象,以后在视图函数中直接用session就可以了。
      • 判断session.modify

闪现:flash, get_flashed_messages()

  • 设置值:flash
    • flash('超时错误', category='xxx'),
  • 取出值:get_flashed_messages(),一旦取过一次,在另一个视图函数中再取就没了
    • get_flashed_messages(category_filter=['xxx']), 如果filter里面是个['别的分类']就取不出来
  • 基于session,必须设置app.secret_key='aaasdfasdfa
  • 使用场景:在某个地方放一个值,过段时间需要取出来。在一个视图中设置值,在另一个视图中就可以拿到值。

请求扩展:

  • 请求到来之前执行方法

    • @app.before_request

    •   @app.before_request
        def before_request():
            print('我来了')    
  • 请求执行完后执行方法

    •   @app.after_request
        def after_request(response)
            print('我走了')
            return response
    • 执行顺序:先b后a, 如果before_request函数中有return,那么也会走after_request
    • before_request请求拦截后(也就是return),所有response都执行
  • before_first_request:服务器启动时执行,只执行这一次

  • teardown_request:一定会执行,即使出异常也会走

  • @app.errorhandler(404): 404的时候执行;errorhandler(500);

中间件:

  • 跟Django中的不一样

  • flask中请求一旦到来,要执行app() —> 本质:执行的是app. __ call __ 方法 整个flask的入口

  •   class MyMiddleWare():
          def __init__(self, my_wsgi_app)
              self.wsgi_app = my_wsgi_app
    
          def __call__(self, environ, start_response):
              print('之前执行一些东西')
              obj = self.wsgi_app(environ, stast_response)
              print('之后执行一些东西')
              return obj
    
      @app.route('/'):
      def index():
          print('ok')
    
      if __name__ == '__main__':
          app.wsgi_app = MyMiddleWare(app.wsgi_app) # 调用自己写的类的__call__方法
          app.run()
    
       #请求来了,执行app.__call__的本质执行的是:self.wsgi_app(environ, start_response)  

    补充:中间件是一个很大的概念,

    • web中间件:nginx,是在请求和服务器之间装了个东西,这个东西也叫中间件,nginx做请求的转发
    • 数据库中间件:orm,程序和数据库中间的东西
    • 消息队列中间件:两个程序之间要进行交互,需要用到消息队列中间件

蓝图:

  • ​ 干什么用:分文件分目录,把代码全放在一个文件里面不就乱套了?所以要把文件功能分一分

  • 使用蓝图划分文件目录

    • 生成蓝图对象:在一个应用目录下面的 __ init __.py 里面写

      from flask import Flask, Blueprint
      
      admin = Blueprint(
          'admin',  # name, 产生app的时候只有一个import name
          __name__,  # import name
          template_folder='tamplates', # 指定admin这个蓝图用的模板和静态文件,如果不指定,用的是app的
          static_folder='static'
      )
    • 注册蓝图对象

      app.register_blueprint(admin, url_prefix='/admin')
      # url_prefix  url前缀,访问admin蓝图里面的路由需要加个前缀admin
    • 使用:

      #注册路由
      @admin.route('/index')
      def index():
          pass
      
      # 使用请求扩展
      @admin.before_request
      def before_request():
          pass
  • 蓝图项目目录实例:

    flask_project
    - flask_project
        - __ init __.py # 生成app,导入admin蓝图,导入user蓝图,注册admin蓝图,user蓝图
        - admin
            - __ init __ .py  # 注册蓝图,
            - static   # 存放静态文件
                - 1.png
            - templates  # 存放模板文件
                - index.html
            - views.py  # 导入蓝图,写view @admin.route()
        - user:同admin结构一样
    - run.py  # 导入app: from flask_project import app , app.run()
    

转载于:https://www.cnblogs.com/KbMan/p/11487961.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flask笔记 的相关文章

  • Java爬虫技术(一)普通网站爬取图片

    爬虫简单介绍 用户和网站服务器的操作如下 而爬虫需要做的是模拟仿照用户机 去向服务器发送请求数据 并接受响应数据 接着去解析数据 获得我们想要的数据 步骤大致分为 准备好要爬取的网址 定义爬虫的参数 开始爬 获取爬取的数据 使用xpath技
  • 未来两年以调试osgearth源码为主线,且整合GIS引擎

    按照 https blog csdn net hankern category 9281734 html 本来以为每天调试一节就可以了 没想到 试了3周 结果只调试了3节 平均每周一节 那么就要用2年左右了 花费这么长时间 值不值得呢 跳出
  • com.alibaba.easyexcel导出EXCEL文件

    com alibaba easyexcel导出EXCEL文件 1 POM XML
  • Redis安装配置

    1 下载 http redis io download 2 安装 安装C语言环境 已经安装可跳过 yum install gcc c 下载压缩包 wget http download redis io releases redis 4 0
  • Windows 运行窗口(win+r)常用命令

    打开运行窗口方法 windows系统电脑中 直接按键盘快捷键 win r 通过点击左下角搜索图标 输入 运行 进行搜索 就能找到 运行 点击之后即可打开运行窗口 点击左下角开始程序图标 然后点击 windows系统 之后 点击 运行 即可打
  • 曼彻斯特编码/差分曼彻斯特编码

    1 曼彻斯特编码 Manchester Encoding 位中间电平从低到高跳变表示 0 位中间电平从高到低跳变表示 1 2 差分曼彻斯特编码 differential Manchester encoding 在最初信号的时候 即第一个信号
  • stm32最小系统板烧录的简单说明

    首先 最小系统板烧录往往需要usb转串口模块 可以自行购买 一般买了会附送资料 上面都会有相应的驱动 根据以往的经验来看 这个模块的驱动经常出问题 比如一直显示占用 装了之后需要手动切换 具体可百度 就是打开设备管理器 点击相应com端口
  • Kubernetes 常见问题总结

    如何删除不一致状态下的 rc deployment service 在某些情况下 经常发现 kubectl 进程挂起现象 然后在 get 时候发现删了一半 而另外的删除不了 root k8s master kubectl get f flu
  • css实现勾号 √

    check position relative display inline block width 25px height 25px background red border radius 25px check after conten
  • 经典CNN卷积神经网络发展史+论文+网络实现(PyTorch)

    网络搭建目录 Lenet 学习笔记 pytorch官方demo代码复现 放风筝的猪的博客 CSDN博客 AlexNet网络结构详解与代码复现 放风筝的猪的博客 CSDN博客 VGG网络结构详解与代码复现 感受野计算 放风筝的猪的博客 CSD
  • qt制作播放器-进度条属性设置

    QSlider groove horizontal border 1px solid 4A708B background C0C0C0 height 30px border radius 1px padding left 1px paddi
  • Centos8安装WPS

    下载安装包 到wps官网下载linux版本的安装包 根据自己的linux是 32 位还是64位的 下载对应的安装包 我下载的是64位的rpm包 下载地址 http www wps cn product wpslinux 安装目录 如果想安装
  • Unix哲学

    Unix哲学 起源于Ken Thompson在早期关于如何设计一个设计接口简洁 小巧精干的操作系统的思考 随着Unix文化在学习如何尽可能发掘Thompson设计思想的过程中不断成长 同时它还一路上博采众长 Unix哲学并不是一个正规的设计
  • Vue-ElementUI实现前端多选框切换分页选择保留之前选的数据,分页选择、回显功能

    前端页面开发经常会遇到切换分页时 之前页面选的数据不会保存以及选择的数据如何回显的问题 然后之前写的方法还有个bug 新增数据时 选择多个分页的数据保存后 进入编辑页 如果直接保存的话只会提交首页选择的数据 如果是分页一页一页点击过去 最后
  • ==和equals区别

    对于基本数据类型 byte short char int float double long boolean 比较的是值 他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的 对于这样的字符串 123 也是相同的道理 在常量池
  • java取出每年的七夕情人节日期

    83 java取出每年的七夕情人节日期
  • deactivate不能关闭venv

    python virtualenv deactivate 命令无法正常关闭venv虚拟环境 用的是python3 用vritualenv封装项目后发现 venv目录下没有bin目录 activate文件和deactivate文件在Scrip
  • 中小企业实施MES管理系统,这几点需要注意

    制造业是中国经济命脉所系 是立国之本 强国之基 作为世界制造大国 制造业一直是热门话题 当下 中小制造企业的产业地位不断提升 想要规范生产制造 提升产品竞争力 进行实施MES管理系统解决方案的企业越来越多 那么企业应该如何选型才能保证生产管
  • swift UITextField 设置leftView不生效

    swift 给UITextField 设置了 leftView 但是不显示 设置UITextField的光标输入位置 设置UITextField的leftView 但是没显示 视图层上也没有 let iamgeView UIImageVie
  • macOS Monterey 12.0.1 App闪退问题

    Apple还是一贯的尿性 m1升级了最新的macOS Monterey 12 0 1 发现了一些App闪退 CleanMyMac X 偏好设置 gt 通用 gt 取消 声音 这个选项 重新启动就不会闪退了 MWeb 去AppStore下载了

随机推荐

  • 数电常混淆的知识点(结合FPGA)

    组合逻辑最大的缺点就是会存在竞争冒险 这种竞争冒险问题是非常危险的 常常会引起电路的不稳定性和工作时的不确定性 时序逻辑就可以极大地避免上面的问题 从而使系统更加稳定 时序逻辑最基本的单元就是寄存器 寄存器具有存储功能 一般是由 D 触发器
  • 组合逻辑与时序逻辑的综合

    目录 1 综合简介 1 1 逻辑综合 1 2 RTL综合 1 3 高级综合 2 组合逻辑的综合 2 1 优先级结构的综合 2 2 利用逻辑无关紧要条件 2 3 ASIC单元与资源共享 3 带锁存器的时序逻辑综合 3 1 锁存器的无意综合 3
  • ‘StringArray‘ object has no attribute ‘tolist‘的处理方法

    先看原代码 sams pd array 2weq 2 2432 2 2ewq 2 2ew 1 sam pd unique sams sam tolist 想要利用pd的unique函数将列表里的数据进行去重处理 但是其返回的是一个np ar
  • 无影云桌面

    概念 无影云桌面 是阿里云推出的一台放在云上的超级电脑 这是基于云计算和虚拟化技术的云上桌面服务 通过客户端登录云桌面之后 就像操作本地电脑一样 在云端电脑完成开发 办公 并且数据都在云端 在任何地方都可以登录访问 最近体验了一段时间 操作
  • bazel build //:go

    作者简介 何 源 古典互联网从业者 2014年底加入英语流利说 目前主要负责 Platform Team 来流利说工作之前 在 the Plant 杭州工作 内 容 大 纲 1 程序包管理 Package Management 2 代码管理
  • ENVI_IDL:读取OMI数据(HDF5)并输出为Geotiff文件+详细解析

    目录 1 课堂内容 2 知识储备 3 编程 1 课堂内容 读取OMI数据 HDF5 并输出为Geotiff文件 最重要的是数据的处理以及输出 这里我个人觉得难度不大 第一 获取OMI文件的NO2数据集的数据以及对数据中的异常值做处理 譬如全
  • 进程的五种通信方式

    一 管道 1 什么是管道 我们把一个进程连接到另一个进程的数据流称为一个管道 它是最古老的进程通信形式 2 原型 匿名管道 include
  • 【云原生之Docker实战】使用Docker部署File Manager文件管理系统

    云原生之Docker实战 使用Docker部署File Manager文件管理系统 一 File Manager简介 1 File Manager简介 2 File Manager特点 二 检查宿主机系统版本 三 检查本地docker环境
  • 微软禁俄下载、开源投毒攻击、Rust不会重写Linux、开放原子峰会7月举办

    WeOpen Insight 是腾源会推出的 开源趋势与开源洞见 内容专栏 不定期为读者呈现开源圈内的第一手快讯 优质工具盘点等 洞察开源技术发展的风向标 预见未来趋势 1 开源社区新闻 1 Linus Torvalds 称并未用 Rust
  • java计算月份所在的季度

    java计算月份所在的季度 月份 2 3 下班的时候无意中看到同事写的根据月份计算季度的代码 获取两个时间内的季度集合 返回结果说明 quarterList1 2019 1 quarterList2 2019年1季度 param start
  • IDEA Writing classes... 比较慢

    IDEA配置修改如下 1 File gt Settings 2 Build Execution Deployment gt Compiler Build process heap size 配置为 2048 3 Build Executio
  • hex转换成C语言源程序吗,第6节:把.c源代码编译成.hex机器码的操作流程

    从业十年 教你单片机入门 第6讲 第一步 打开一个现成的工程 双击桌面 keil uVision4 的图标启动keil软件 如果发现此软件默认打开了一个之前已经存在的工程 请点击上面 Project 选项 在弹出的下拉菜单中选择 Close
  • html js实现分页代码,js前端分页实现

    最近做的一个项目 整个页面的数据更新要纯ajax实现 没办法 连分页都得由我来写了 基本思路还是像后台那样实现分页 后台实现分页其实也就是用后台的程序来处理那段分页的模版 于是我想 下面是分页的模版 1 代码 JavaScript 代码 h
  • 常见的颜色空间概念

    文章目录 1 RGB颜色空间 2 HSV颜色空间 3 YCbCr颜色空间 4 Lab颜色空间 5 YUV颜色空间 1 RGB颜色空间 是最常见的面向硬件设备的彩色模型 它是人的视觉系统密切相连的模型 根据人眼结构 所有的颜色都可以看做是3种
  • 2017年阳光私募基金一季度报告

    2017年阳光私募基金一季度报告 时间 2017 05 09 10 14 00 来源 网友评论 0 条 一 证券类私募行业大数据 一 证券类私募行业大数据 一 规模篇 1 私募基金管理规模达11 90万亿 证券类规模为2 63万亿 2 百亿
  • C语言eigen存为txt文件,如何使用线性代数的C模板库Eigen?

    我有一个矩阵的图像处理算法 我有自己的矩阵运算代码 乘法 逆 但我使用的处理器是ARM Cortex A8处理器 它有NEON协处理器进行矢量化 因为矩阵运算是SIMD操作的理想情况 我要求编译器 mfpu neon mfloat abi
  • webrtc音频引擎之audio_processing介绍

    audio processing模块为语音处理的精华 包含音频的回音处理 降噪处理 自动增益处理等音频的核心处理业务算法 静音检测在另外一个模块 不知道新版与这基本算法放到了同一个模块木有 模块结构为 1 aec和aecm 也就是回音消除
  • 【Kubernetes 008】多种类型控制器区别及实际操作详解(RS,Deployment,DaemonSet,Job,ConJob)

    Pod是k8s中的基本结构 前面我们已经创建过一个 但是生产环境中往往不需要我们自己去创建pod 而是通过创建管理pod的控制器而达到自动批量管理pod的目的 这一节我们就一起来看看k8s中有哪些控制器 以及这些控制器的一些基本操作 我是T
  • Spring配置DataSource数据源

    在Spring框架中有如下3种获得DataSource对象的方法 1 从JNDI获得DataSource 2 从第三方的连接池获得DataSource 3 使用DriverManagerDataSource获得DataSource 一 从J
  • flask笔记

    python中的web框架 a socket服务端 b 路由转发 c 模板渲染 Django 同步框架 a 用的别人的 bc自己写的 Flask 同步框架 a 用的别人的 b自己写的 c用的别人的 jinja2 Tornado 异步框架 a