Flask笔记day01

Flask框架内容:

视图&路由

flask简介
虚拟环境的安装
路由的各种定义
导入Flask类 from flask import Flask
Flask 函数接收一个参数__name__,它会指向程序所在的包: app=Flask(name)
装饰器的作用是将路由映射到视图函数 index
@app.route(’/’)
def index():
return ‘hello world’
Flask应用程序实例的run方法 启动WEB服务器
if name==‘main’:
app.run()
在程序运行过程中,程序实例中会使用 url_map 将装饰器路由和视图的对应关系保存起来

状态保持

>cookie
>session

模板

基本使用
过滤器&自定义过滤器
模板代码复用: 宏/继承/包含
模板中特有变量和函数
Flask-WTF表单

CSRF

跨站请求伪造

数据库操作

ORM
FLASK-SQLAlchemy
增删改查操作

蓝图

单元测试

web应用程序的本质

流程 : 客户端发送一个请求报文(包含:请求行 请求头 请求体)给服务端,服务端接收到请求后,解析请求,进行路由分发,执行具体的业务逻辑代码,并生产响应数据,再返回响应报文(响应行 响应头 响应体)给前端,前端接收到数据后进行展示.
WSGI协议 是应用程序 与服务器连接的桥梁
flask诞生于2010年
flask本身就是一个内核,其他所有的功能都要用到扩展,其WSGI工具箱采用werkzug(路由模块),模板引擎使用jinja2.这两个是flask框架的核心
Flask笔记day01_第1张图片
创建虚拟环境命令: Python2中创建: mkvirtualenv py_flask
在python3中创建虚拟环境: mkvirtualenv -p python3 py3_flask
退出虚拟环境: deactivate
删除虚拟环境命令: rmvirtualenv 虚拟环境名称
所有的虚拟环境都位于/home/ 下的隐藏文件 .virtualenvs下
使用装饰器路由去与视图函数进行关联
app = Flask(name, # 这第一个参数指代的是flask所在的包(模块),其可以决定静态文件从哪个位置开始找
static_path = ‘/staic’, # 表示静态文件访问的路径
static_url_path = ‘/static’, # static前面必须加/ 否则会报错 /表示主目录
static_folder="static’, # 表示静态文件所存放的目录,默认值为 static
template_foler = ‘templates’ # 表示模板文件存放的目录
)
help(modules) 查看当前python有哪些模块

程序加载配置

三种方式: 从配置对象中加载(常用) app.config.from_object( 传入的是类名)
从配置文件中加载 app.config.form_pyfile( 传入的是文件的名字) : 创建一个ini的配置文件
从环境变量中加载 app.config.form_envvar()
打开调试模式DEBUG 就是当可以打印出程序运行状态信息(包括异常 错误信息)
给路由添加参数,格式就是<参数名>,并且视图函数需要接收这个参数 int:user_id
在浏览器敲回车默认是get的请求方式
request.method 返回的是请求的方式
url_map 返回的是当前flask中的路由和视图函数的映射关系
body 请求体
json数据格式: 就是一个字典样式的字符串,json格式字符串 json.dumps( 要转的字典) 字典转json字符串 json.loads( 要转的json) json转字典
xml和json 本质都是一个字符串 只是格式不同而已
jsonify(字典) 把字典转成json字符串,并作为一个响应对象返回给前端 在flask里面 要返回json的话 一般尽量返回jsonify jsonify会指定响应内容的数据格式
重定向 return redirect( url/路由路径) return redirect(url_for(‘视图函数’,参数)) url_for:取到指定视图函数所对应的路由URL,并且可以携带参数
返回自定义状态码 即在返回时,返回指定的状态码

int:user_id 在url中 /index/1232 后面的这个叫查询字符串

自定义正则转换器

创建一个类继承自BaseCoverter 定义一个regex = ‘正则规则’重写父类的regex 在将这个转换器添加到默认的转换列表中: app.url_map.converter[“re”] = 自定义的这个类名 然后在路由中使用re这个自定义转换器, 可以传入参数的方式定义自定义转换器规则: 重写父类的init方法: def init(self,url_map,*args): # url_map必须写 因为父类有这个参数 *args用于接收传入的参数
super(自定义的类名,self).init(url_map)
self.regex = args[0]
然后在路由中定义规则 @app.route(’/user/’)
转换器就是定义了url规则的转换对象
如果只有一个地方使用自定义转换器的话 只要重写父类的regex属性就是可以了 如果是多个匹配规则 就要重写父类的构造方法 传入匹配规则
系统默认提供的转换器有: string int flaot uuid path any 6种
将to_python to_url 在自定义的转换器类中 重写这两个方法 当调用这个类的匹配规则时 先进这两个函数进行处理
def to_python(self,value): # 当匹配到参数之后,对参数做进一步处理之后,再返回给视图函数中
return value.split(’,’) # 返回的是一个列表了
def to_url(slef,value): # 在使用url_for的时候,对视图函数传入的参数进行处理,处理完毕之后以便能够进行路由匹配
return ‘,’.join(str(v) for v in value) # 将列表处理成一个字符串返回到路由中

异常捕获

HTTP异常主动抛出

abort(404) 主动抛出异常,抛出一个给定状态代码的HTTPException或指定响应, abort(HTTP的错误状态码)

错误捕获

errorhandler 装饰器: 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所修饰的方法
@app.errorhandler(500/异常) # errorhandler()这个装饰器不仅可以捕获状态码还可以捕获异常
def intername_error(e):
return “xxxxxx”

请求钩子

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,如:
在请求开始时,建立数据库连接
在请求开始时,根据需求进行权限校验
在请求结束时,指定数据的交互格式
为避免编写重复功能的代码,Flask 提供了通用设施的功能,即请求钩子
请求钩子是通过装饰器的形式实现 flask支持如下四中请求钩子:
before_first_request 在处理第一次请求前执行
before_request 在每次请求前执行 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request 如果没有抛出错误,在每次请求后执行, 接受一个参数: 视图函数作出的响应 在此函数中可以对响应值在返回之前做最后一步修改处理 需要将参数中的响应在此参数中进行返回
@app.after_request
def after_request(response): # 在请求之后会调用,并且函数里面接收一个参数:响应, 还需要将相应进行返回.
# 可以在此函数中对响应数据做统一的处理 响应来自index返回的响应.
return response
teardown_request 在每次请求后执行 接受一个参数: 错误信息 如果有相关错误抛出
@app.teardown_request
def teardown_request(error):
# 在请求之后会执行,如果请求的函数报有异常, 会把具体的异常传入到此函数中

视图函数 就是用来返回给前端数据用的 路由传递的参数默认是做string处理 也可以指定参数类型 <>里面的内容是动态的
falsk中 定义一个路由,默认的请求方式为: GET OPTINS(自带的) HEAD(自带的)
如果发的是HEAD,就是返回url支持的请求方式 请求方式放在headers中的allow里面,如果是head请求 ,就是只返回请求头 不返回响应体.
falsk框架两大核心: werkzeug工具集和jinja2 werkzeug实现路由 调用和web服务器网关接口 jinja2 实现了模板
werkzeug工具集里面有: Request Response routing(装饰器路由)模块
routing模块: Rule(描述的是路由和视图函数的关系) Map(装规则的容器) BaseCoverter(定义匹配规则) MapAdapter(协调Rule匹配工作)
Flask笔记day01_第2张图片
ubuntu查看pid: netstat -apn | grep 5000 找到5000端口对应的pid 再 kill -9 pid

状态保持

因为http是一种无状态协议,浏览器请求服务器是无状态的, 协议对事物没有处理能力
无状态: 指一次请求一次响应的过程
无状态的原因: 浏览器与服务器是使用socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的socket连接,而且服务器也会在处理页面完毕之后销毁页面对象.
实现状态保持的两种方式:
在客户端存储信息使用cookie
在服务端存储信息使用session

Cookie:

指某些网站为了辨别用户身份 进行会话跟踪而存储在用户本地的数据(通常经过加密)
复数形式:Cookies Cookie是服务器生成,发给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器
cookie是存储在浏览器中的一段纯文本信息,建议不存储敏感信息
cookie基于域名安全,不同域名的cookie是不能相互访问的,如访问itcast时向浏览器中写入了cookie信息,使用同一浏览器访问baidu时,无法访问到itcast.cn写的cookie信息即浏览器的同源策略.
当浏览器请求某网站时, 会将本网站下所有cookie信息提交到服务器,所有在request中读取cookie信息.
cookie设置/生成 在服务器中 cookie的获取在浏览器请求中获取 即 request中

浏览器通过请求报文发起登录请求并带着登录的账号与密码到服务器,服务器接收到请求后校验账号与密码,如果正确,给出响应,响应中带着设置的cookie: response.set_cookie(‘user_id’,‘1’) response.set_cookie(‘user_name’,‘laowang’),浏览器获取到响应后,自动将cookie存储在浏览器中,下次发送请求的时候, 浏览器就自动将cookie放到请求中带到服务器,服务器取到传过来的cookie,根据cookie就可以知道是否登录 是谁登录
设置cookie: 通过响应带给浏览器
expires:到期的意思
获取cookie: 从请求中获取 : request.cookies ==> 获取cookie
response = make_response # make_response是生成一个响应对象
response.set_cookie(‘user_id’,‘1’) response.set_cookie(‘username’,“laowabg”,max_age=3600): set_cookie()为设置cookie max_age为设置cookie的有效期的,单位为秒.
user_id = request.cookies.get(‘user_id’) # 获取cookie值
response=make_response(’’)
response.delete_cookie(‘user_id’) # 删除cookie的user_id 这个删除原理是将cookie的过期时间调成1970年的了

session

对于敏感 重要的信息, 要存储在服务器中国,在服务器中进行状态保持的方案就是session
session依赖于Cookie
session数据的获取: session:请求上下文对象,用于处理http请求中的一些数据内容
session的交互流程: 浏览器发起登录请求,服务器接收到后处理请求: 进行校验,保持用户信息到服务器,并给出响应将sid()返回给浏览器,浏览器拿到sid后会将sid存储在cookie中,下次请求的时候自动带上sid请求浏览器,浏览器通过请求取到sid再通过sid取到对应的用户信息.
使用session之前需要配置下: app.config[“SECRET_KEY”] =‘sdfsfsd’ 这个SECRET_KEY会对session中的信息进行加密
session.pop(‘user_id’)用于删除cookie,pop会返回user_id里面的值
如果浏览器将cookie保存关闭了, 那么cookie和session都不能状态保持了,session和cookie可以保存在url中 : ? sessionid = xxxxxx

上下文

上下文: 相当于一个容器,保存了Flask程序运行过中的一些信息 ,Flask中有两种上下问,请求上下问和应用上下文

请求上下文

在flask中,可以直接在视图函数中使用request这个对象进行获取相关数据,而request就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有: request session
request: 封装了HTTP请求的内容,针对的是http请求
session: 用来记录请求回话中的信息,针对的是用户信息
请求上下文只有在请求发生时才有用

应用上下文

应用上下文的作用主要是帮助request获取当前的应用,它是伴request而生,随request而灭的
应用上下文只有在应用起来了以后才能去使用current_app
应用上下文对象有: current_app,g

current_app

应用上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,如:
应用的启动脚本是哪个文件 启动时指定了哪些参数
加载了哪些配置文件 导入了哪些配置
连了哪些数据库
有哪些public的工具类 常量
应用跑在哪些机器上 ip多少 内存多大

g变量

g作为flask程序全局的一个临时变量,充当中间媒介的作用,我们可以通过它传递一些数据,g保存的是当前请求的全局变量,不同的请求会有不同的全局变量,可以通过thread id区别

Flask-script的使用

通过使用Flask-script扩展,我们可以在Flask服务器启动的时候,通过命令行的方式传入参数.而不仅仅通过app.run()方法中传入参数如: python hello.py runserver -host ip地址
以上代码告诉服务器在哪个网络接口监听来自客户端的连接,默认情况下,服务器只监听来自服务器所在的计算机发起的连接,即locahost连接
通过命令行在运行的时候指定运行的端口
可以通过python hello.py runserver --help来查看参数
导入Manager from flask-script
app = Flask(name)
manager = Manager(app) # 创建manager与app进行关联
if name == ‘main’:
manager.run()
这样就可以指定端口运行程序

jinja2模板引擎简介

模板: 视图函数的主要作用是生成请求的响应,这是最简单的请求,视图函数有两个作用: 处理业务逻辑和返回响应内容
模板的作用是承担视图函数的另一个作用,即返回响应内容
模板其实是一个包含响应文本的文件,其中用占位符表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取
使用真实值替换变量,再返回最终得到的字符串,这个过程称为"渲染"
使用模板的好处: 视图函数只负责业务逻辑和数据处理(业务逻辑方面),而模板则取到视图函数的数据结果进行展示(视图展示方面)
jinja2: 是python下一个被广泛应用的模板引擎,是Flask内置的模本语言
模板语言: 是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名.

渲染模板函数

Flask提供的render_template函数封装了该模板引擎
我们只要渲染模板,并把模板数据给render_template ,它就会自动把数据填在该填的地方了
就是往模板里填一些数据,在前端展示出来
render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值

使用

{{}} 来表示变量名 这种{{}} 语法叫做变量代码块
jinja2模板中的变量代码块可以是任意的python类型或者对象,只要它能够被python的str()方法转换为一个字符串就可以
用{%%} 定义控制代码块,可以实现一些语言层次的功能,比如循环或if语句
from flask import render_template
@app.route(’/’)
def demo1():
return render_template(‘demo6_template.html’) # 这里是把html这个文件进行渲染给前端了

过滤器

过滤器的本质就是函数,有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化 运算等,而在模板总是不能直接调用python中的某些方法,那么这就用到了过滤器
使用方式:
过滤器的使用方式为: 变量名 | 过滤器 如: {{variable | filter_name(*args) }} : | 为管道
如果没有任何参数传递给过滤器,则可以把括号省略掉 如: {{variable | filter_name }}
上面过滤器的作用: 把变量variable的值的首字母转为大写,其他字母转换为小写
模板语言中的注释: {# 注释#}

链式调用

在jinja2中,过滤器是可以支持链式调用的,如: {{ “hello world” | reverse |upper }}

常见内减过滤器

字符串操作

默认html的字符串会按照原样显示,可以使用safe进行标识该字符串是安全的,如果使用safe标识该字符串是安全的话,那么就会按照html语言格式进行显示和执行
safe:禁用转义 这个表示按照代码原来的意思显示和操作
capitalize: 把变量值的首字母转大写,其他字母转小写
lower: 把值转成小写
upper: 把值转成大写
title: 把值中的每个单词的首字母都转成大写
reverse: 字符串反转
formate: 格式化输出
striptages: 渲染之前把值中所有的HTML标签都删掉
truncate: 字符串阶段

列表操作

first: 取第一个元素
last: 取最后一个元素
length: 获取列表长度
sum: 列表求和
sort: 列表排序
想查看当前所有的过滤器,需要ctrl+过滤器名称 找到filters 里面是所有的过滤器

语句块过滤

自定义过滤器

自定义过滤器:方式1:装饰器的形式:
@app.template_filter(‘lireverse’)
def do_lireverse(li):
temp=list(li) 将传入的列表生产一个新的列表
temp.reverser() 反转
return temp
方式2:直接添加过滤器到列表中
def do_lireverse(li):
temp=list(li) 将传入的列表生产一个新的列表
temp.reverser() 反转
return temp
app.add_template_filter(do_lireverse,‘lireverse’)

控制代码块

主要有两种: if/else if /else /enif for /endfor
jinja2语法中的if语句与python中的if是相似的 ,后面的布尔值或返回布尔值的表达式将决定代码中哪个流程被执行. 过滤器可以用在if语句中
{%if comments | length > 0 %}
there are {{comments |length}} comments
{%else%}
there are no comments
{%endif%}

循环

在jinja2中使用循环来迭代任何列表或者生成器函数
{%for post in posts%}


{{post.title}}


{{post.text | safe}}



{%endfor}
循环和if语句可以组合使用
{%for post in posts if post.text %}

{{post.title}}


{{post.text | safe}}



{%endfor}
{ % loop.index % } loop表示循环 index 表示下标 loop.index 表示获取循环的下标
Flask笔记day01_第3张图片

你可能感兴趣的:(Flask笔记day01)