falsk是小而精的框架,但是热度高,

所有很多爱好者提供了很多扩展插件

功能强大,美而不足的就是兼容稳定性有时候不太好,不过大部分还是很可以的

Flask-Session

flask内置session式写在浏览器上的,感觉和其他框架不太一样,

现在学习一个写在后台的session

现在我想写在redis中,怎么操作呢

  1. 先要下载包 flask-session
  1. from flask import Flask, render_template
  2. from flask import views # 导入视图模块
  3. from flask import session
  4. from flask_session import Session # 导入Session类
  5. from redis import Redis
  6.  
  7. app = Flask(__name__, static_folder="static")
  8. # # # # # # 配置 # # # # # # # #
  9. red = Redis("127.0.0.1", , db=) # 实例化Redis连接
  10.  
  11. app.config["SESSION_TYPE"] = "redis" # key大写,value小写!!!
  12. app.config["SESSION_REDIS"] = red # 指定连接是Redis实例,让session执行写入redis的方法
  13.  
  14. Session(app) # 添加配置
  15.  
  16. # FBV
  17. @app.route('/')
  18. def index():
  19. session["key"] = "strong_key"
  20. print(session) # <RedisSession {'_permanent': True, 'key': 'strong_key'}>
  21. # 浏览器观察key是 session :8a1561f9-800c-4f03-be69-2ea336c39d39
  22. # redis中 通过"session:8a1561f9-800c-4f03-be69-2ea336c39d39"获取到value是
  23. # "\x80\x03}q\x00(X\n\x00\x00\x00_permanentq\x01\x88X\x03\x00\x00\x00keyq\x02X\n\x00\x00\x00strong_keyq\x03u."
  24. return "this's index"
  25.  
  26. # CBV
  27. class LoginClass(views.MethodView):
  28.  
  29. def get(self):
  30.  
  31. return render_template("login.html")
  32.  
  33. def post(self):
  34. return "ok"
  35.  
  36. app.add_url_rule("/login", view_func=LoginClass.as_view("login"))
  37.  
  38. app.run(debug=True, host="127.0.0.1", port="")

seesion_py文件

源码大概意思

需要配置的

WTForms - MoudelForm

后端写页面render到前端的组件

学过django应该了解form组件

flask中的第三方库WTForms功能是类似的

开始写一个简单的登录注册吧。。

没有拆分,直接写在一个app上了

  1. from flask import Flask, render_template, request
  2. from flask import views # 导入视图模块
  3. from wtforms.fields import simple, core
  4. from wtforms import Form
  5. from wtforms import validators
  6.  
  7. app = Flask(__name__, static_folder="static")
  8.  
  9. # # # # # # # # # # # # # # # # # # # #
  10. # # # # # # MoudelFrom组件 # # # # #
  11. # # # # # # # # # # # # # # # # # # # #
  12.  
  13. class LoginForm(Form):
  14. username = simple.StringField(
  15. label="用户名",
  16. validators=[
  17. validators.DataRequired(message="不能为空"),
  18. validators.Length(min=, max=, message="不能小于3位,不能大于5位")
  19. ],
  20. render_kw={"class": "my_username"}
  21. )
  22.  
  23. password = simple.PasswordField(
  24. label="密码",
  25. validators=[
  26. validators.DataRequired(message="不能为空"),
  27. validators.length(min=, max=, message="密码必须是6位"),
  28. validators.Regexp(regex="\d+", message="密码必须是数字")
  29. ],
  30. render_kw={"class": "my_pwd"}
  31. )
  32.  
  33. # 注册页面的form
  34. class RegForm(Form):
  35. username = simple.StringField(
  36. label="用户名",
  37. validators=[
  38. validators.DataRequired(message="不能为空"),
  39. validators.Length(min=, max=, message="不能小于3位,不能大于6位")
  40. ],
  41. # render_kw={""} 不写了默认class:这个字段(username)
  42. )
  43.  
  44. password = simple.PasswordField(
  45. label="密码",
  46. validators=[
  47. validators.DataRequired(message="不能为空"),
  48. validators.Length(min=, message="密码不能小于6"),
  49. validators.Regexp(regex="\d+", message="密码必须位数字"),
  50. ],
  51. render_kw={"class": "reg_pwd"}
  52. )
  53.  
  54. re_password = simple.PasswordField(
  55. label="重复密码",
  56. validators=[
  57. validators.EqualTo(fieldname="password", message="两次密码不一致")
  58. ]
  59. )
  60.  
  61. email = simple.StringField(
  62. label="邮箱",
  63. validators=[
  64. validators.Email(message="格式不正确")
  65. ],
  66. )
  67.  
  68. # 性别 单选
  69. gender = core.RadioField(
  70. label="性别",
  71. coerce=int,
  72. choices=(
  73. (, "男"), (, "女"), (, "保密")
  74. ),
  75. default=
  76. )
  77.  
  78. # 爱好 多选
  79. hobby = core.SelectMultipleField(
  80. label="爱好",
  81. coerce=int,
  82. choices=(
  83. (, "小姐姐"),
  84. (, "小萝莉"),
  85. (, "小哥哥"),
  86. (, "小正太"),
  87. (, "阿姨"),
  88. (, "大叔"),
  89. ),
  90. default=(, )
  91. )
  92.  
  93. submit = simple.SubmitField(
  94. label="提交"
  95. )
  96.  
  97. # FBV
  98. @app.route('/')
  99. def index():
  100. return "this's index"
  101.  
  102. # CBV
  103. class LoginClass(views.MethodView):
  104.  
  105. def get(self):
  106. login_form = LoginForm()
  107. return render_template("login.html", lf=login_form)
  108.  
  109. def post(self):
  110. login_form = LoginForm(request.form)
  111. if login_form.validate():
  112. return ""
  113. else:
  114. return render_template("login.html", lf=login_form)
  115.  
  116. class RegClass(views.MethodView):
  117.  
  118. def get(self):
  119. rf = RegForm()
  120. return render_template("reg.html", rf=rf)
  121.  
  122. def post(self):
  123. rf = RegForm(request.form)
  124. if rf.validate():
  125. return ""
  126. else:
  127. return render_template("reg.html", rf=rf)
  128.  
  129. app.add_url_rule("/login", view_func=LoginClass.as_view("login"))
  130. app.add_url_rule("/reg",view_func=RegClass.as_view("reg"))
  131. app.run(debug=True, host="127.0.0.1", port="")

app.py文件

html页面

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta http-equiv="content-Type" charset="UTF-8">
  5. <meta http-equiv="x-ua-compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Title</title>
  8. </head>
  9. <body>
  10. <form action="" method="post" novalidate>
  11. {{ lf.username.label }}{{ lf.username }}{{ lf.username.errors. }}
  12. <p>{{ lf.password.label }}{{ lf.password }}{{ lf.password.errors. }}</p>
  13. <input type="submit" value="提交">
  14. </form>
  15. </body>
  16. </html>

login.html

  1. <head>
  2. <meta http-equiv="content-Type" charset="UTF-8">
  3. <meta http-equiv="x-ua-compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="" method="post">
  9. {% for field in rf %}
  10. <p>{{ field.label }}{{ field }}{{ field.errors. }}</p>
  11. {% endfor %}
  12. </form>
  13.  
  14. </body>
  15. </html>

reg.html

FLASK 的Session和MoudelForm插件的更多相关文章

  1. Flask中session实现原理

    前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...

  2. Flask的session——关于写扩展所学习到的

    这两天端午节.趁着端午节没事干,写了个flask的扩展--flask-RedisSession 在flask中使用该扩展可以让你借助redis数据库轻松获得server-side session. 这 ...

  3. Flask的session使用

    由于http是无状态保存的协议,session可以看作不同请求之间保存数据的一种机制.flask的session是基于cookie的会话保持. 流程 当客户端进行第一次请求的时候,客户端的HTTP r ...

  4. 第六篇 flask中session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 Flask 中 session 的使用 1. Flask 中 session 是 ...

  5. Flask里面session的基本操作

    #session是依赖于flask的session模块 #如果想使用session模块,在配置里必须定义sessionkey from flask import Flask,session #建立对象 ...

  6. flask 的session

    python的flask操作设置.获得与删除session 首先讲一下Python的flask中session与cookies的关系,session是储存在服务器中的,cookies是储存在浏览器本地 ...

  7. Flask之session相关

    Flask的session简介 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使 ...

  8. flask自定义session

    根据内置session原理可以进行session的定制: #!/usr/bin/env python # -*- coding:utf-8 -*- import uuid import json fr ...

  9. Flask 进阶session和上下文管理解析

    session的源码流程 将session放置在redis中 安装 pip install flask-session 使用 import redis from flask import Flask, ...

随机推荐

  1. 【Noip2015】斗地主

    题目 #include<bits/stdc++.h> using namespace std; int pai[20],T; //pai[]统计牌的数量 int n; int ans; v ...

  2. Java斗地主案例、异常和自定义异常整理

    模拟斗地主洗牌发牌 1.1 案例介绍 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张 ...

  3. 常见Web攻击

    一.SQL注入 1. sql注入的危害 非法读取.篡改.删除数据库中的数据 盗取用户的各类敏感信息,获取利益 通过修改数据库来修改网页上的内容 注入木马等 2. 实例 MYSQLDB # 通过在用户名 ...

  4. 069、Calico的默认连通性(2019-04-12 周五)

    参考https://www.cnblogs.com/CloudMan6/p/7536746.html   Calico 跨主机连通性测试   root@host1:~# docker exec bbo ...

  5. C# GetHashCode在x64与x86版本下不一样

    最好指定一下目标平台

  6. [物理学与PDEs]第5章习题5 超弹性材料中客观性假设的贮能函数表达

    设超弹性材料的贮能函数 $\hat W$ 满足 (4. 19) 式, 证明由它决定的 Cauchy 应力张量 ${\bf T}$ 满足各向同性假设 (4. 7) 式. 证明: 若贮能函数 $W$ 满足 ...

  7. 使用select为描述符设置超时

    int readable_timeo(int fd, int sec) { fd_set rset; struct timeval tv; FD_ZERO(&rset); FD_SET(fd, ...

  8. dense prediction问题

    dense prediction  理解:标注出图像中每个像素点的对象类别,要求不但给出具体目标的位置,还要描绘物体的边界,如图像分割.语义分割.边缘检测等等. 基于深度学习主要的做法有两种: 基于图 ...

  9. 练习:javascript-setInterval动画运动平移,定时器动画练习

    常见问题:定时器加速问题,每次点击会启动一个定时器,解决先清除定时器 <!DOCTYPE html> <html lang="en"> <head&g ...

  10. LeetCode前100题(EASY难度)

    1 Two Sum Given an array of integers, return indices of the two numbers such that they add up to a s ...