zoukankan      html  css  js  c++  java
  • 《Flask Web开发实战:入门、进阶与原理解析》 学习笔记 好书呀

    1 一个视图函数可以绑个 URL
    2 为了让互联网上的人都可以访问,需要安装程序的服务器有公网ip

    3 如果过度使用扩展,在不需要 的地方引人,那么相应也会导致代码不容易维护 ,应该尽从实际需求出发,只在需要 的时候使用扩展

    4 flask、flask扩展、程序自己的环境变量都可以通过flask的app.config作为统一的接口来设置和获取。app.config是字典的子类,所以可以像操作字典那样使用它

    5 session也可以像字典一样使用

    6 g也可以像字典一样使用

    7 配置变量可以存储在python脚本、python类和json格式的文件中

     

     1 after_request 钩子和 after_this_request 钩子必须接收一个响应类象作参数,并且返回同 个或更新后的响应对象
    2 响应报文的首部包含一些关于响应和服务器的信息,这些内容由 F lask 生成 ,视图函数中返回的内容即为响应报文中的主体内容
    图菌数可以返回最多由 个元素组成的元组:响应主体、状态码、首部字段 其中首部字段可以为字典,或是两元素元组组成的列表
    3 abort()函数后面不需要return,因为abort后面的代码将不会被执行
    设置响应对象的格式:

    在 Flask 中,如果想要在响应中添加一个 cookie , 最方便的方法是使用 Response 类提供的
    set_cookie()方法 要使用这个方法,我需要先使用 make_response()方法手动生成一个响应对
    response set_cookie (’ name ’, name )
    name = request . cookies . get (' name ', Human ’) #从 Cookie 中获取 name值


    当我们使用 session 对象添加 cookie 时,数据会使用程序的密钥对其进行签名,加密后的数据存储在块名为 session 的 cookie 里
    使用session 对象存储的 Cookie ,用户可以看到其加密后的值,但无法修改它 因为 session 中的内容使用密钥进行签名,一旦数据被修改,签名的值也会变化这样在读取时,就会验证失败
    过 session 对象的 pop 方法删除设置的cookie 
    默认情况下, session cookie 会在用户关闭浏览器时删除

    ==========服务器推送技术,除了下表列的方法,还有websocket 

     

     为防止攻击,通过jinja的escape进行转义,即把变量标记的内容标记为文本,而不是HTML代码

     常见的攻击:sql注入,跨站脚本攻击,跨站伪造请求,频繁请求

    url_for生成的是相对url,若要生成绝对url,需要将_external参数设为true
    MVC (Model-ViewController ,模型 - 视图-控制器)

    查询字符串从问号?开始,以键值对的形式写出,多个键值对之间使用&分隔 。

    获取request中的参数值,建议用get requset.args.get(’name’,’Human')

    重定向回上一个页面:
    redirect(requset.referrer or url_for("hello"))
    redirect(requset.args.get("next"),url_for("hello"))

    jinja中常用定界符:
    语句:{%%}
    表达式: {{}}
    注释:{##}
    Jinjia允许你在模板中使用大部分 Python 对象

    {% if %}
    {% else %}
    {% endif %}

    使用ORM的好处:方便切换数据库(支持多种DBMS);ORM帮忙做了些防止sql注入的工作

    自己写sql的好处:灵活,快

    表名生成规则:

     

     据库和表一旦创建后,之后对模型的改动不会自动作用到实际的表中 如采使改动生效,最简单的方式是调用 db. drop all()方法删除数据库和表,然后再调用 db . create_a ll()方法创建

    我们在创建模型类实例的时候并没有定义 id 字段的数据,这是因为主键由 SQLAlchemy 管理

    一般来说,定义关系需要两步,分别是创建外键和定义关系属性。在更复杂的多对多关系中,我们还需要定义关联表来管理关系 。

     动态url:使用“< 名>”的形式表示 @app . route ( ' /greet /<name> ' )

     flask中对应的MVC:  M->sqlAlchemy   V->jinja2  C->视图函数

     

    请求解析和 响应封装实际上大部分是由 Werkzeug完成的,Flask子类化Werkzeug的请求( request)和响应( Response )对象并添加了和程序相关的特定功能

     访问的页面不存在,则会返回404错误

    HEAD OPTIONS 方法的请求由Flask 处理 ,而像 DELETE 、 PUT 等方法一般不会在程序中实现,在后面我们构建 WebAPI 时才会用到这些方法

    响应报文的首部包含一些关于响应和服务器的信息,这些内容由 F lask 生成

    通过定义方法列表,我们可以为同一个 URL 规则定义多个视图函数,分别处理不同 HTTP方法的请求

     每个钩子可以注册任多个处理函数,函数名并不是必须和钩子名称相同,
    重定向会导致浏览器地址栏中的url放生变化

    不过我们般并不直接使用 json 模块的 dumps() load() 等方法,因为 Flask 通过包装这些方法提供了更方便的 jsonify()函数
    session存储的内容通过签名加密了,但通过工具可以轻易读取(即使不知道秘钥),所以session中不能存储敏感信息

    我们可以在视图函数中或在视图函数内调用的函数/方法中使用所有上下文全局变量。
    重定向到上一个页面:return redirect(request.referrer or url_for(’ hello ’) )   手动加入包含当前页面 URL 的查询参数,这个查询参数一般命名为 next

     为了安全,需要对重定向路由做校验

    AJAX:让我们可以在不重载页面的情况下和服务器进行数据交换,在接收到响应数据后局部更新页面

    使用jQuery发送AJAX请求:jQuery包装了JavaScript,可以更简单的方式编写JavaScript,更方便的操作ajax,同时处理了不通浏览器的AJAX兼容问题

    美元符号是 jQuery 的简写,我们通过它来调用 jQuery 提供的多个方法,所以$.ajax()等同于jQuery.jax()

    对于处理 AJAX 请求的视图函数来说 ,我们不会返回完整的 HTML 响应,这时一般会返回局部数据

    服务器推送技术:websocket(通过TCP实现的全双工模式),兼容性也比SSE更强

    安全问题:
    1)SQL注入
    如 利用url中的参数查数据库
    --使用ORM、校验入参类型、参数化查询
    2)跨站脚本
    如url参数中有js语句 或 提交的留言里有js语句--HTML转义
    --HTML转义 、校验入参
    3)跨站请求
    如B网站的一个图片的src指向了A网站的一个接口,从而对A网站进行了操作
    --令牌(伪随机数)放到表单隐藏字段和session中

    ==============

    WSGI 是开发 Python Web 程序的标准,所有的 Python Web 框架都需要按照 WSGI 的规范来
    编写程序 。 客户端和服务器端进行沟通遵循了 HTTP 协议,从 HTTP 请求到我们的 Web 程序之间,还有另外一个转换过程一一从 HTTP报文到 WSGI 规定的数据格式。

    uWSGI、 Gunicorn 是实现了WSGI协议的web服务器

    在Flask中使用 session 非常简单 ,只需要设置好密钥 ,就可以在视图函数中操作session对象 
    向 session 中存储时, 会生成加密的 cookie 加时用的浏览器接收到响应会将 cookie 储起来 户再次发请求浏览器会自动在请求中加这个 cookie 值
    Flask 接收把 session cookie 的值解析到 session 对象里 时我们可以再次从session读取

    Flask 提供的 session 将用户会话存储在客户端 ,和这种存储在客户端的方式相反,另一种 实现用户会话的方式是在服务器端存储用户会话 , 而客户端只存储一个 session ID 。当接收到客户端 的请求时,可以根据 cookie 中的 session ID 来找到对应的用户会话内容。这种方法更为安全和强健,你可以使用扩展 Flask-Session 来实现这种方式的session

    当包或包内的模块被导入时 , __init__.py文件将被自动执行 。

    从__init__.py中导入变量时不需要注明__init__的路径,只需要从包名称导入

    获取UTC时间:
    from datetime import datetime
    datetime.utcnow()

    Flask 允许加载多次配置,重复的配置以最后定义的配置为准

    在蓝本中,使用 before_request 、 after_request 、 teardown_request 等装饰器注册的请求处理函数是蓝本独有的
    在蓝本中也可以使用 before_app_request 、 after_app_request 、 teardown_app_request 、 before_app first_request 方法,这些方法注册的请求处理函数是全局的

    app.register_blueprint(auth bp , url prefix= ’/auth’ )#设置url前缀
    app.register_blueprint(auth_bp , subdomain= ’auth’ )# 设置子域名 auth.exarnple.corn/login 的URL才会触发auth蓝本中的login视图

    url_for( ’ auth.login ’ ) #在全局生成蓝本的url,需要带上蓝本名字。若在蓝本内调用,可以使用url_for('.login')

    若你在注册蓝本时为蓝本定义了 URL 前缀,即设置了 url_prefix ,那么最终静态文件路径会自动设为“/蓝本前缀/static ”,这时可以省略 static_url_path 的定义 。

    通过给蓝图的before_request加login_required装饰,从而实现对整个蓝图的所有函数加了登录保护

    可以在flash消息中添加视图连接,Flash提供的Markup类可以将文本标记为安全文本,从而避免渲染时对Jinjia2进行转义

    装饰器执行顺序:

     

    URL样例:http ://api.example.com

     

     Flask 在 MethodView 类中提供了 decorators属性,使用它可以为整个资掘类的所有视图方法附加装饰器






    水电费





  • 相关阅读:
    枚举和字符串转换
    JavaScript string.format
    Jquery 中toggle的用法举例
    JQuery 实现倒计时
    找位置
    图算法
    文件操作总结
    动态规划——总结
    回文字符串
    a+b_1
  • 原文地址:https://www.cnblogs.com/testzcy/p/11828095.html
Copyright © 2011-2022 走看看