巨蟒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.递归 自己调用自己 两个口: ...
随机推荐
- Lintcode---线段树修改
对于一棵 最大线段树, 每个节点包含一个额外的 max 属性,用于存储该节点所代表区间的最大值. 设计一个 modify 的方法,接受三个参数 root. index 和 value.该方法将 roo ...
- winform最小化及关闭提示
public PrintService() { InitializeComponent(); this.WindowState = FormWindowState.Minimized; } priva ...
- Python 实现根据不同的程序运行环境存放日志目录,Python实现Linux和windows系统日志的存放
说明:在我们开发的时候,有时候是在windows系统下开发的代码,我们的生产环境是Linux系统,更新代码就需要修改日志的环境,本文实现了代码更新,不需要配置日志文件的目录,同样也可以延伸到ip地址 ...
- unity, iterate immediate children and iterate all children
遍历所有直接子节点(immediate children): foreach (Transform child in transform) { // do whatever you want with ...
- 点滴积累【JS】---JS小功能(JS实现多物体缓冲运动)
效果: 思路: 利用setInterval计时器进行运动,offsetWidth实现宽度的变动,在用onmouseover将终点和所选中的DIV放入参数再进行缓冲运动. 代码: <head ru ...
- SQL server账号无法登陆
- Atitit.prototype-base class-based 基于“类” vs 基于“原型”
Atitit.prototype-base class-based 基于“类” vs 基于“原型” 1. 基于“类” vs 基于“原型”1 2. 对象的产生有两种基本方式.一种是以原型(proto ...
- Codeforces Round #256 (Div. 2) C. Painting Fence(分治贪心)
题目链接:http://codeforces.com/problemset/problem/448/C C. Painting Fence time limit per test 1 second m ...
- JVM Specification 9th Edition (3) Chapter 2. The Structure of the Java Virtual Machine
Chapter 2. The Structure of the Java Virtual Machine 内容列表 2.1. The class File Format (class文件的格式) 2. ...
- 如何在线制作gif图片?
最近想做个gif在线制作的网站,所以研究下了imagemagick和graphicsmagick制作gif图片站已经做出来了:有兴趣的朋友可以先看看http://www.sosogif.com/mak ...