前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >flask框架(二)

flask框架(二)

作者头像
小闫同学啊
发布2019-07-18 12:49:50
1.1K0
发布2019-07-18 12:49:50
举报
文章被收录于专栏:小闫笔记小闫笔记

flask框架(二)

1.cookie(掌握)

掌握的内容需要会敲。

解释:用来保持服务器和浏览器交互的状态。有服务器设置,存储在浏览器里面。

作用:用来做广告的推送。

cookie的设置和获取

设置cookie:response.set_cookie(key,value,max_age)

max_age表示cookie在浏览器的存储时间,单位是秒

如果不设置max_age那么默认的有效期就是当前浏览器关闭的时候

获取cookie:request.cookies.get("key")

2.session(理解)

解释:服务器和用户来做状态保持的,里面存储的是敏感信息(比如身份证,登录信息),有服务器设置,并存储在服务器

作用:用来做用户的登录状态保持。

session的设置和获取

设置session:session[key] = value

获取session:value = session.get(key)

注意点:

session的存储依赖于cookie

存储在cookie中的sessionID需要加密,需要秘钥(SECRET_KET)

3.上下文(了解)

current_app功能开发(获取数据库连接、日志)

解释:就是一个容器

请求上下文

request:封装的是请求相关的数据(是客户端中存储的)

session:封装的是和用户相关的敏感信息(是服务器存储的)

应用上下文(在项目中具体应用)

current_app:是app的一个代理对象,可以通过他获取app身上设置的各种属性,主要用在模块开发中,current_app是全局的,每来一个客户端,app就开通一个current_appg对象存储current_app的服务信息。服务完毕后,自动销毁。

g:一个局部的全局变量,主要用在装饰器中

好比我们去吃自助餐,老板app不可能服务我们每一个人,老板会让服务员current_app来服务我们,每个人都会有一个服务员来进行接待,我们想吃东西,会拿一个盘子g来装东西,当我们吃完,盘子g会进行一个回收。

4.Flask_Script(掌握)

解释:属于Flask的扩展

作用:用来动态运行一个程序,配合flask_migrate做数据库迁移

使用格式

1、安装:pip install flask_script

2、导入Manager类

3、创建对象manager管理app

在启动程序的时候就不能写app.run(debug=True)

而是写manager.run()括号里面不能在写debug,因为它没有这个参数。开启debug看后面。

开启debug也可以在创建对象之前加入:app.config[DEBUG]=True也可以开启debug

4、使用manager启动程序

启动命令:python xxx.py runserver -h(host是IP地址) -p(端口号) -d(调试模式)运行过程可以指定参数

-d代表的就是debug,不需要再写其他的内容。

5.render_template(掌握)

属于jinja2模板

业务逻辑就是数据库的增删改查

解释:属于jinja2的模板函数

好处

1、以后的视图函数,只负责业务逻辑的处理,比如:数据库的增删改查

2、以后数据的展示,全部都有jinja2的模板负责

使用格式

response=render_template('模板文件')模板文件就是html文件。

render_template会将所有内容转换成字符串,打包成响应体,返回给response,浏览器直接读取即可。

模板文件必须写在templates文件夹下面,需要新建文件夹

高内聚,低耦合:

所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。

对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。

6.模板语法,获取变量(理解)

解释:在模板中获取视图函数的变量

格式

{{ 变量 }}变量可以是任何类型的数据

变量分开获取的方式

tuple[0]tuple.1

list.0list.1

dict.name

dict["age"]

如果字典使用方括号,获取,需要写成字符串,如果不是字符串,那么则会被当成变量对待.

地址被占用,解决方法:

终端里面杀死端口

lsof -i:5000

kill PID(占用端口号的程序的PID)

7模板语法,分支循环判断(掌握)

模板语法的种类

分支格式:

代码语言:javascript
复制
{% if 条件 %}
    语句1
{% else  %}
    语句2
{% endif %}

循环格式语法:

代码语言:javascript
复制
{% for 变量 in 容器 %}
{% endfor %}

注释:

代码语言:javascript
复制
{# 这里是注释的内容 #}

pycharm中想让html文件输入内容有提示,可以将templates文件夹改成jinja2的格式,支持模糊匹配

选择templates文件夹----右键----点击Mark directory as------选择Template Forlder----跳出的框里面选jinja2

快捷键:pycharm中写html文件,for + tab键可以快速创建for循环。

dict.key那么这个key会当成字典中的一个键,dict[key],那么这个key当成一个变量

8.系统字符串过滤器(理解)

解释:过滤器,过滤一些你想要的数据

格式{{ 字符串 | 字符串过滤器}}

常见的字符串过滤器有:

记住:reverse,其他有印象即可

safe:禁用转义

代码语言:javascript
复制
<p>{{ '<em>hello</em>' | safe }}</p>

capitalize:把变量值的首字母转成大写,其余字母转小写

“hello PYTHON”会将整体看成一个字符串,只将h变大写

代码语言:javascript
复制
<p>{{ 'hello' | capitalize }}</p>

lower:把值转成小写

如果值里面有汉字,汉字不会变,汉字没有大小写

代码语言:javascript
复制
<p>{{ 'HELLO' | lower }}</p>

upper:把值转成大写

代码语言:javascript
复制
<p>{{ 'hello' | upper }}</p>

title:把值中的每个单词的首字母都转成大写

代码语言:javascript
复制
<p>{{ 'hello' | title }}</p>

reverse:字符串反转

中文是可以反转的

代码语言:javascript
复制
<p>{{ 'olleh' | reverse }}</p>

format:格式化输出

可以将name和17替换占位符

代码语言:javascript
复制
<p>{{ '%s is %d' | format('name',17) }}</p>

striptags:渲染之前把值中所有的HTML标签都删掉

代码语言:javascript
复制
<p>{{ '<em>hello</em>' | striptags }}</p>

em代表的是斜体(h5里面的)

9.系统列表过滤器(理解)

解释:过滤器,过滤一些你想要的数值

格式{{ 列表 | 列表过滤器}}

常见的列表过滤器有:

first:取第一个元素

代码语言:javascript
复制
<p>{{ [1,2,3,4,5,6] | first }}</p>

last:取最后一个元素

代码语言:javascript
复制
<p>{{ [1,2,3,4,5,6] | last }}</p>

length:获取列表长度

代码语言:javascript
复制
<p>{{ [1,2,3,4,5,6] | length }}</p>

sum:列表求和

代码语言:javascript
复制
<p>{{ [1,2,3,4,5,6] | sum }}</p>

sort:列表排序

默认是升序

代码语言:javascript
复制
<p>{{ [6,2,3,1,5,4] | sort }}</p>

过滤器支持链式调用

10.自定义过滤器(掌握)

解释:当系统提供的过滤器满足不了需求的时候,需要自定义

自定义过滤器有两种格式

1、先定义好函数,再将函数添加到系统默认的过滤器列表中

def 函数名:pass

app.add_template_filter(函数名,‘过滤器名字’)

2、定义函数的时候,直接使用系统过滤器进行装饰

代码语言:javascript
复制
@app.template_filter('过滤器名字')
def 函数名():
    pass

案例:

1、获取列表偶数和

列表过滤器里面没有反转,但是python里面的列表有反转的方法。

升序,再反转就可以实现降序。

2、反转字符串

11.代码复用之宏(了解)

解释:相当于python中的函数,定义好一段功能,在需要的时候进行调用即可

定义格式:

代码语言:javascript
复制
{% macro 宏名(参数)%}
{% endmacro %}

使用格式:

代码语言:javascript
复制
//使用当前文件定义好的宏
{{ 宏名(参数) }}

//使用其他文件定义好的宏
{% import '文件' as 别名 %}
{{ 别名.宏名(参数)}}

因为有些功能要重复使用,频率很高,所以可以封装成宏,就可以直接调用了.

12.代码复用之继承(掌握)

解释:一个子模板继承自父模板

作用:共性抽取,代码复用

父模板

1.所有子类都具有的相同的内容的,在父模板中就直接写死

2.每个子类的模板中不一样的内容,使用block模块定义好.

子模板

1.根据子类自己的需求,去重写父类中的block对应的内容

2.如果重写之后,还想保留父类的内容,那么使用{{ super }}

3.继承格式:{% extends '父类文件名' %},写在页面的顶部

4.重写父类:

代码语言:javascript
复制
{% block 要重写部分的名称 %}
    内容
{% endblock %}

注意:

定义block的格式

代码语言:javascript
复制
{% block 名称 %}
    内容  
{% endblock %}

13.代码复用之包含(了解)

解释:在一个文件中完全拥有另外一个文件,不够灵活,没办法扩展

格式:

代码语言:javascript
复制
# 方式一
{% include '文件'%}
# 方式二
{% include '文件' ignore missing %}

注意点:ignore missing如果包含的文件不存在,不会报错

14.模板使用练习(掌握)

loop.index0代表的是遍历的时候可以获取到从0开始的索引

loop.index从1开始

15.模板特有变量(了解)

解释:不需要通过python程序传递就可以直接使用的变量

常见的特有变量如下:

config:就是flask中的app.config,表示应用程序中的所有配置信息.app.config里面的信息

request:表示请求上下文对象,封装的是请求相关的数据

g局部的全局变量(了解)

url_for():反解析,通过函数的名字,解析到视图函数的路径

url_for("视图函数",key:value)

get_flasked_messages():用来消耗flash方法中存储的消息.

场景:登录出错,可以显示

注意点:使用flash存储消息的时候需要设置SECRET_KET,因为flash内部的消息存储,依赖于session.

看pycharm中的html文件中命令有没有提示,如果没有,检查文件夹有没有被设置为jinja2模式,还有看看这个html文件有没有被关联

flash()的视图函数调用了几次就是往flash(是一个列表)存了几条视图函数里消息,再调用get_flashed_message()消耗flash里面的消息,一旦消耗,就一次消耗光,不用,就不消耗.

16.csrf攻击流程(了解)

解释:跨站点请求伪造

掌握:需要理解攻击流程图

代码演示:webA(正常网站) webB(黑客网站)

17.csrf攻击手动解决(了解)

解释:

在cookie中增加一个csrf_token

在表单中增加一个csrf_token

校验:取出cookie和表单中的csrf_token比较如果二者一致,那么是正常请求

具体过程看图

18.CSRFProtect解决csrf(理解)

使用流程(要求会用这个流程):

1/安装扩展包pip install flask-wtf

2/导入包from flask-wtf.csrf import CSRFProtect

3/创建CSRFProtect对象,保护app对象

4/设置SECRET_KEY,便于csrf_token加密

5/需要在表单中设置一个scrf_token即可

例子:注册案例

register.py

代码语言:javascript
复制
from flask import Flask, render_template, request
from flask_wtf.csrf import  CSRFProtect

app = Flask(__name__)

#设置密码
app.config["SECRET_KEY"] = "fdffdf"

#保护app
CSRFProtect(app)

@app.route('/',methods=["GET","POST"])
def hello_world():

    #1.如果是GET请求,直接返回注册页面
    if request.method == "GET":
        return render_template("file16register.html")

    else:
        #2.如果是POST请求,处理注册业务
        #2.1获取参数
        username = request.form.get("username")
        password = request.form.get("password")
        repassword = request.form.get("repassword")

        #2.2校验参数,为空校验
        if not all([username,password,repassword]):
            return "参数填写不全"

        #2.3两次密码是否一致
        if password != repassword:
            return "两次密码输入不一致"

        #2.4返回注册成功
        return "恭喜你, 注册成功"



if __name__ == '__main__':
    app.run(debug=True)

register.html

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="" method="post">

    {# 只要使用了CSRFProtect保护app,那么可以直接使用csrf_token()方法获取csrf_token值 #}
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">

    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    确认密码:<input type="password" name="repassword"><br>

    <input type="submit" value="注册">
</form>


</body>
</html>

注意点:

1/CSRFProtect一旦保护了app之后,会对POST,PUT,DELETE,PARCH做校验.

all ([username,password,repassword])

[]中任意一个值为空就是false.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈技术精选 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • flask框架(二)
    • 1.cookie(掌握)
      • 2.session(理解)
        • 3.上下文(了解)
          • 4.Flask_Script(掌握)
            • 5.render_template(掌握)
              • 6.模板语法,获取变量(理解)
                • 7模板语法,分支循环判断(掌握)
                  • 8.系统字符串过滤器(理解)
                    • 9.系统列表过滤器(理解)
                      • 过滤器支持链式调用
                    • 10.自定义过滤器(掌握)
                      • 11.代码复用之宏(了解)
                        • 12.代码复用之继承(掌握)
                          • 13.代码复用之包含(了解)
                            • 14.模板使用练习(掌握)
                              • 15.模板特有变量(了解)
                                • 16.csrf攻击流程(了解)
                                  • 17.csrf攻击手动解决(了解)
                                    • 18.CSRFProtect解决csrf(理解)
                                    相关产品与服务
                                    对象存储
                                    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档