巨蟒python全栈开发flask3
首先,我们新建一个项目:
这个时候,我们调用ab函数,可以在所有的模板中使用.
上边是一个特殊装饰器,
1.flask特殊装饰器
下面说几个特殊的装饰器
再请求之前的装饰器
运行:
这个时候,服务端打印的结果是GET和index Page
一开始可能打印多个,可能是请求图标,请求一次就会打印一个GET
下面是我们打印的结果:
这个时候装饰器里边的东西就没有用了(仔细理解)
在请求之前和之后理解的都是不严谨的.
应该理解的是"在请求"进入服务之后,在请求进入视图函数之前
我们再写一个login页面
运行,这样就会造成重定向次数过多而报错.
运行:
函数不停的在下面的两个红框位置进行跳转:
下面我们再引入白名单机制:直接进入视图函数
这个时候,再次运行:
也就是说,跳过了上图的内容:之前的请求,再走到下图中的login视图函数,走到下面的函数,直接返回"login Page"
我们在修改一下视图函数,也就是说,我们直接加入session
这样只会在访问的一瞬间,加入session.
这样也就是基于before_request加入的login页面
@app.after_request这个表示的是在请求结束视图函数之后,返回客户端之前
]访问上边的页面:
服务端打印出下面的内容:
其中包括response,
再次运行:
服务端得到下图的内容:
我们对列表里边的内容进行替换:换成2000000
服务端得到的结果,见下图.
注意,上边必须是一个唯一的,不能再多添加内容了.
运行:
修改下面的内容
运行:
得到下图内容的结果:
.Flask 中的特殊装饰器
- 自己写的装饰视图函数用来验证登录
- Flask提供了几个小的装饰器 用来装饰函数 .# 在请求进入服务之后, 进入视图函数之前
@app.before_request
def look(): .# 在请求 结束视图函数之后 响应返回客户端之前
@app.after_request
def af1(res) .请求顺序:
正常 : be1 - be2 - be3 - vf - af3 - af2 - af1
异常 : be1 - af3 - af2 - af1 .重定义错误信息
@app.errorhandler()
def error404(errormessage):
多写几个,看一下结果:
也就相当于是中间件;
django 的方式,和falsk在上边的这种方式是一样的
异常的话,应该怎样处理?
django的方式
而现在的flask对应的b1和a1,b2和a2,b3和a3不一定是对应关系.在上边我们写的代码中flask看似有关系,实际上没有任何的关系
新版本django是绿色的箭头,老版本django的是红色的箭头,具体看下面:
而我们的flask遵循的就是老版本的django的方式,具体见下图:(粉色的箭头)
下图是,在django中有关系的情况下,才会用,注意这个点:
先将,下面的session清除,再访问下面的界面:
这个时候,我们把session去除掉
再次访问,在be1里边就会发生阻塞问题.,就不会走到be2了
@app.errorhandler()
括号里边需要填写异常的编号.
重新运行:前端得到的页面,注意:我们写的是错误的地址
服务端打印的只是,请求之前和之后的内容,以及errormessage返回的信息
我们也可以向下面的写法,如果错误,直接跳转到百度的首页
访问下面的网址:
直接就得到下面的百度首页
如果函数,我们不懈404参数,
运行:得到下面的结果:报错
错误的内容,就是一个参数,注意函数里边的参数,就可以随便定义,毕竟只是一个形参,但是必须写这个参数,不写这个参数,就会报上边页面的问题.
修改之后,运行:服务端得到下面的页面.
2.flask之CBV
FBV我们已经熟悉了,只是加上一个装饰器,CBV这节课我们再次学习一下.
重新开始写我们的CBV
处理,
下面,我们运行一下,看一下效果.
我们看到了这个,支持get请求.
我们看一下是不是支持post,下面,我们将get请求函数注释掉,得到下面的内容
运行,下面叫做不支持方法,不叫报错
这个时候,服务端得到的是405错误
我们在和这个类中添加一个列表,注释get
我们,再次访问下面的内容,报错原因是,没有对应的方法GET
下图这个是指的是,抛出的异常,是错误
在这里边有很多问题需要解释一下
这个时候,是函数里边包含函数
__doc__指代的就是下面的注释的内容
我们可以确定上边的methods是个None,
也就是说,view_func的结果是login,那么endpoint的结果是什么呢?
这个时候,cls加上括号,表示的就是初始化的对象.
上边的cls指代的是login,
上图是八种请求协议
现在的情况是,遍历里边的每一个值.从类里边找key.
执行的位置见下图:
meth指代的是get的视图函数.
.Flask 中的 CBV
class Login(views.MethodView):
# methods=["POST","GET"]
# decorators = []
def get(self):
return "login" def post(self):
return "post_login" app.add_url_rule("/login",view_func=Login.as_view(name="login"))
3.Falsk回顾基础:::三天结束(回顾整个flask基础)
.response
from flask import render_template,redirect,send_file,jsonify
HTTPResponse
render_template
redirect
特殊类型返回值:
.send_file(文件路径) 打开并返回文件内容 Content-Type:文件类型 自动识别文件类型
.jsonify({k:v}) Content-Type:application/json app.config["JSONIFY_MIMETYPE"] .request
request.method 请求方式
request.args url参数
request.form FormData 数据
request.json 请求头 Content-Type:application/json 数据序列化至此
request.data 只要请求体中有内容 b"”
request.files 接收FormData中的文件 .session
from flask import session
app.secret_key = "$%^&*("
session["user"] = "username" 将session存放在 客户端的Cookie中 ,CookieKey 在app.config["SESSION_COOKIE_NAME"]中存储 .路由
动态参数路由
@app.route("/detail/<stu_id>")
def detail(stu_id) .endpoint Flask Mapping 路由和视图的指向
.methods 允许进入视图函数的请求方式
其他内容就不再这里回顾了
.初始化配置
Flask(__name__)
.template_folder 模板存放路径
.static_folder 静态文件存放路径
.static_url_path 静态文件访问路径
大部分会由nginx帮助我们配置静态文件.
.config对象
class Setting(object):
DEBUG=True
app.config.from_object(Setting) #这个用的最多 .蓝图 重点
from flask import Blueprint
bp = Blueprint("bp",__name__,url_perfix="/前缀") @bp.route("/bp")
def bp_func(): app.register_blueprint(pb) #重点位置 目录结构
app01的结构,几乎和django是一样的 .特殊装饰器 中间件(三种)
@app.before_request # 在请求进入视图函数之前
@app.after_request # 在结束视图函数之后,在响应返回客户端之前
def af5(ret): 正常 be1 - be2 - vf - af5 - af4 - af3 - af2 - af1
异常 be1 - af5 - af4 - af3 - af2 - af1 @app.errorhandler()
def error404(error_message): .CBV
from flask import views class Login(views.MethodView):
def get(self):
pass def post(self):
pass app.add_url_rule("/login",endpoint=None,view_func=Login.as_view(name="login")) endpoint == as_view(name="login") 中的 "login"
4.flask-session(三方组件重点)
我们需要在设置中安装第三方组件:
武佩奇是某个tarnado的源码贡献值,基本没人用.但是确实是很强啊
现在,我们用的大写的Session已经将Flask自带的session替换掉了.
用法:
下面,我们说一下这个第三方组件的一些注意事项:
(1)不想将Session的信息存放在Cookie中
(2)将Session存放在Redis (redis一般情况下放在内网中)
(3)Cookie中保存Session的ID
通过session中ID查找redis,想要破解信息,先破解ID,再破解Redis,Session中的信息还是加密的.
这里边是Session初始化,走的是init
上图中,session的接口指的是什么?很想存放在config中的字典内.
点击进去,看一下这个自定义的配置
redis和memcached,后者更快一点点,容量小一点,处理的快一点点,不是太多.
memcached只支持三方的持久化,自身不支持//只支持字符串和int//目前大家都是认可的但是很少用的.
redis支持两种持久化方式.//支持hash存储.
两者都有致命的bug.不要放在公网上.
MongoDB一般不用来作缓存,用redis,但是可以有一些其他处理
SQLALCHEMY其实就是ORM的操作对象.(三方的框架)
最好的框架是models.
sqlalchemy可能需要这个.这个也是很重要的.
猜测,自伤而下读取其中的数据库.
读远吗,我们知道要小写redis.
在上图中我们知道redis是小写的,并且和session_interface接口
这个时候,我们需要在python中装redis模块
图形化操作安装和pip install也是可以的
开始学习1分钟学会
没有安装,怎么办?先下载,再安装
在官网上下载的是linux的redis,在window上没有
没有找到,我们该如何处理?在github上边下载.
找到第二篇的内容,
这样我们就能下载完成了.
注意,端口就是6379
安装完成后,我们看下是否开启服务
下图中,我们看到环境白能量中已经添加了redis了,同时也验证了上边控制中,添加了开启服务的命令.
控制台也可以get到在pycharm刚才写的内容
db参数有16(0-15)个数据库:
上边的实例化的过程中,我们可以设置一个参数.db=1
这个时候,我们get最后的kkk,结果显示是空的.
现在我们查询一下数据库1
下面是切换数据库和到某个数据库里边拿值
上边我们简单学习了一下redis
下面我们进入上图的RedisSessionInterface接口
实例化的内容,包括下图:
这个时候,我们访问login
运行:得到下面的结果
上边的四五张图片是错误的:
正确得见下图,主要是在配置中写错了,:
# Author: studybrother sun
from flask import Flask, request,session
from flask_session import Session
from redis import Redis
app=Flask(__name__)
app.config["SESSION_TYPE"]="redis" #源码中的写法
app.config["SESSION_REDIS"]=Redis(host="127.0.0.1",port=6379,db=15) #源码中的写法
# app.secret_key="12321jkjo"
# app.default_config
# app.secret_key="()&*&^*%"
Session(app)
#1.不想将Session的信息存放在Cookie中
#2.将Session存放在Redis
#3.Cookie中报错Session的ID
#下面写一个视图函数,思考为什么还用原来的session?
@app.route("/login")
def login():
session["user"]="username"
return "OK"
if __name__ == '__main__':
app.run(debug=True)
运行:
F12得到下面的session内容,session对应的Value是一个不可以被破解的ID
这个时候,我们看到application里边的session中的Value存储的就是UID,代表的就是用户ID
也就是不可被破解的ID
下面,我们再写一个视图函数
运行:
出现上图的原因是因为我们login里边设置了session里边的user键对应的是username
现在,我们需要重新情况session里边的内容:
我们通过删除上图中的session,然后
再次访问.
这个时候,得到的是没有值情况下的默认值设置.
再次运行上边的url,插入一个新的session
通过控制台,利用键我们拿不到值,什么情况?
上图最后一条语句,显示的是取值的方法,我们可以看到user和username
其中还包括时间戳.
序列化:
这个时候,我们可以拿到字典
时间戳+k+v 时间是31天.
上边,理解成返回字典就可以了
这也就是,我们给错了redis,或者写错了键就会开启session
注意上边的写法也是会报错,但时,我们理解的是SESSION_TYPE对应的值必须是小写的redis才行
这个时候,我们可以先处理将类写在settings里边:
这个时候,我们只需要引入我们设置的属性即可
5.flask之WTForms(三方组件重点)
不能叫组件,可以说是一个插件,django的modelform,在其他的组件中叫WTForms
首先,我们需要安装一下.
上图中的SQLAlchemy是可以直接对数据库进行读写的
这个时候,我们需要加上一个视图函数,我们需要对比一下django里边的modelform组件,进行处理这个问题
from flask import Flask,request,render_template app=Flask(__name__)
from wtforms.fields import simple,core #flask里边的modelform
@app.route("/login")
def login():
return render_template("index.html")
if __name__=="__main__":
app.run(debug=True)
wtf_app.py里边写的内容:
# Author: studybrother sun
from flask import Flask,request,render_template
app=Flask(__name__)
from wtforms.fields import simple,core #flask里边的modelform
from wtforms import Form
from wtforms import validators #这个指的是校验条件 class LoginForm(Form):
username=simple.StringField(
label="用户名",
validators=[
validators.DataRequired(message="数据不能为空"),
validators.Length(min=6,max=10,message="%(min)d数据长度问题%(max)d") #设置最小值,最大值
],
render_kw={"class":"my_class"},
id="my_username"
#做css样式的
)
password=simple.StringField(
label="密码",
validators=[
validators.DataRequired(message="数据不能为空"),
validators.Length(min=6,max=10,message="%(min)d数据长度问题%(max)d") #设置最小值,最大值
],
render_kw={"class":"my_class"},
id="my_pwd"
#做css样式的
)
@app.route("/login")
def login():
lf =LoginForm() #实例化上边的类
return render_template("index.html",lf=lf) #传递参数
if __name__=="__main__":
app.run(debug=True)
index.html里边的内容:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-Type" charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width" ,initial-scale="">
<!--上边这个表示手机版的调整尺寸-->
<!--上述2个meta标签"必须"放在最前面,任何其他内容都必须跟随其后-->
<title>Title</title>
</head>
<body>
{{lf}}
</body>
</html>
运行:这个时候,我们得到的是对象属性.
修改上边的内容:
再次运行,我们得到的两个框
思考一下,能不能加上一个submit
这个时候,得到上边的界面.
运行:
点击"登录"
显示下图,没有这个方法
这个时候,我们需要将方法写到路由中.
巨蟒python全栈开发flask3的更多相关文章
- 巨蟒python全栈开发linux之centos1
1.linux服务器介绍 2.linux介绍 3.linux命令学习 linux默认有一个超级用户root,就是linux的皇帝 注意:我的用户名是s18,密码是centos 我们输入密码,点击解锁( ...
- 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理
一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...
- 巨蟒python全栈开发linux之centos6
1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...
- 巨蟒python全栈开发linux之centos3
1.作业讲解 (1)递归创建文件夹/tmp/oldboy/python/{alex,wusir,nvshen,xiaofeng} 下面中的路径没有必要换,在哪里创建都行,根目录下或者tmp目录下或者其 ...
- 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查
内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...
- 巨蟒python全栈开发-第11阶段 ansible_project2
一个NB的网站: https://www.toolfk.com/ CDN:将用户的需求送到最近的节点:内容分发网络 有些是专门做CDN的工具 常用的markdown是需要知道的,短信有字数限制. we ...
- 巨蟒python全栈开发-第4天 列表&元组&range
今日内容大纲 1. 什么是列表 定义: 能装对象的对象 在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求 列表存在索引和切片. 和字符串是一样的. 2. 相关的增删改查操 ...
- 巨蟒python全栈开发-第13天 内置函数 匿名函数lambda
一.今日内容总览 1.内置函数(1):并不是每一个内置函数都是那么常用 上菜:内置函数部分//思维导图:https://www.processon.com/view/link/5b4ee15be4b0 ...
- 巨蟒python全栈开发-第14天 内置函数2 递归 二分查找
一.今日内容总览 1.内置函数补充 repr() 显示出字符串的官方表示形式 chr() arscii码中的字,转换成位置 ord() arscii码中的位置,转换成字2.递归 自己调用自己 两个口: ...
随机推荐
- Heap 3214 LIS题解
依据问题转换成最长不降子序列问题. 10^9的输入数据计算起来还是挺花时间的.由于这里仅仅能使用O(nlgn)时间复杂度了. 只是证明是能够算出10^9个数据的. 由于时间限制是5s. #includ ...
- mac ssh 命令
https://www.cnblogs.com/littleBit/p/5362806.html 1.终端命令 1.打开Mac的命令终端,检查是不是用root登陆,如果不是的话,就输入命令:sudo ...
- git教程,切换分支并拉去
进了目录切换分支: git checkout 5.1 切换完成后拉去分支为: git pull https://www.liaoxuefeng.com/wiki/0013739516305929606 ...
- Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2013 SSIS
VS2012 SSDTBI_VS2012_x86_CHS.exe http://www.microsoft.com/zh-CN/download/details.aspx?id=36843 VS201 ...
- clone和lambda的一个小问题和解决
起因是这样,某管理器类有两个集合,A集合是模板集合,B集合是从模板中实例出的集合. 但是B集合的一些东西,总会调用A集合中的,导致出错. 一开始考虑clone使用不当,但检查后没发现什么问题,后来发现 ...
- CentOS6.2下Qt5.1.0无法输入中文
因为在程序中需要在界面上输入中文,但是系统是英文系统,没有预装中文输入法,于是从网上搜了一下输入法的安装,但是输入法安装好之后,可以再系统中输入中文,但是却无法再Qt中输入中文,只能继续找解决办法 安 ...
- freemarker和jsp的比较
1.共享变量 FreeMarker 的共享变量是我最喜欢的“隐藏”功能之一.此功能可以让你设置自动添加到所有模板的值. 例如,可以设置应用程序的名称作为共享变量. 1 2 Configuration ...
- 脚本 sh 和 ./ 的区别,exec和source
如果.不在PATH里面,要执行当前目录下的可执行文件,使用全路径: ./executable-file PATH是环境变量,如果将当前目录“./”添加到环境变量中,那么也可以不用“./”,直接输入当前 ...
- Linq Mysql GroupBy语句的问题处理
语句如下: var resumeList = db.ChannelResume.Where(model); var groupValues = resumeList.GroupBy(t => n ...
- windows下使用c++调用redis
不废话,unix下c++调用 redis可以看这个: http://blog.csdn.net/youngqj/article/details/8266177 ==================== ...