Session处理实例—Flask网站制作(13)

Posted 光荣之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Session处理实例—Flask网站制作(13)相关的知识,希望对你有一定的参考价值。

新书

速递

吴老的java版《selenium webdriver 实战宝典》python版《selenium Webdriver 3.0 自动化测试框架实战指南》出版了,代码拿来就能用。

文 | 远山近海

Flask网站制作框架

快速制作网站就是这么容易!
安装:pip install Flask













Session处理

通过例子学习之例2

为不同用户设置session,实现结果:
1 不同的用户在相同的页面上看到的内容不同
2 不同的用户所能进入的页面不同

路由文件:
# coding=utf-8from flask import Flask,render_template,request,redirect,session,url_forfrom flask_wtf import FlaskFormimport wtformsfrom datetime import timedelta
app=Flask(__name__)app.secret_key="1234"
class LoginForm(FlaskForm): username = wtforms.StringField('用户名:') password = wtforms.PasswordField('密码:')
@app.route("/",methods=["POST","GET"])def login(): session.clear() ins_LoginForm =LoginForm(request.form) if request.method=="POST": username =ins_LoginForm.username.data # 通过类的实例化来获取表单中的username值 password= ins_LoginForm.password.data if username=="admin"and password=="123456": session["admin"] =username return render_template("public.html") if username=="xiaoming"and password=="123456": session["normal_user"] =username return render_template("public.html") session.permanent = True app.permanent_session_lifetime= timedelta(minutes=1) session.clear() return render_template("login.html", form=ins_LoginForm)
@app.route("/public/")def public(): if session=={}: ins_LoginForm =LoginForm(request.form) return redirect(url_for("login")) if session.get("admin",None) isnot None: return render_template("admin/AdminUser.html") else: return render_template("public.html")
@app.route("/AdminUser/")def AdminUser(): if session=={}: return redirect(url_for("login")) else: return render_template("admin/AdminUser.html")
if __name__ == '__main__': app.debug = True app.run(port=8081)
login() 视图函数
  1. 如果是管理员登录,则为session设置一个admin键,值为当前用户名,即admin
  2. login函数,如果是普通用户登录,则为session设置一个normal_user键,值为当前用户名,即xiaoming
  3. 在return render_template中,并没有把session传递给login页面,因为前面说了,session是全局的,随时随地都可以直接引用,无需传递
  4. 设置了session的有效时间为一分钟,不作操作超过一分钟,则跳转至登录页面
  5. 在该函数里清空了session,即只要一登陆,就先清空session,防止普通用户和管理员在同一台机器上使用同一个浏览器后,普通用户获取到管理员的session
public() 视图函数
  1. 当进入函数时,先判断,如果session为空,说明该登录者不是系统里的用户,他是通过猜地址进来的,那么就直接让他的页面跳转至登录页面
  2. 如果session里的admin键的值不为空,则证明该用户是管理员,那么可点击管理员的可见链接跳转至AdminUser.html页面
  3. 否则,则证明该用户为普通用户,那么可点击普通用户的可见链接跳转至public.html页面,即当前页面
AdminUser() 视图函数
当进入函数时,先判断,如果session为空,说明该登录者不是系统里的用户,他是通过猜地址进来的,那么就直接让他的页面跳转至登录页面,否则,证明该用户为管理员。

注意:
在这里,只要session不为空,就可判断其为管理员,因为在public()函数所对应的public.html模板中,已经设置了如果是管理员,则可见管理员链接,如果是普通用户,则不可见管理员链接,所有,只要能点击管理员链接进入管理员页面的,就一定是管理员。
综上所述,我们就无需再判断是否是管理员还是普通用户,只需判断其是否是通过猜测地址进入管理员页面的即可。
模板文件:
base.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>session练习</title></head><body>session练习&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
{% if session['admin'] %} 你好:{{session['admin']}}{% elif session['normal_user'] %} 你好:{{session['normal_user']}}{% else %} 未登录{% endif %}&nbsp &nbsp &nbsp
{% if session!={} %} <a href="{{url_for('login')}}">退出</a>{% endif %}<br><br><br>
{% block content %}
{% endblock %}
</body></html>
  1. 设置问候语,通过session取到用户名,展示在页面上
  2. 如果session的admin键不存在,normal_user键也不存在,则显示未登录
注意:再次强调,session是全局的,随时随地可以引用,在路由文件里,并没有base()函数,更不可能给这个页面传session值,但在这里就是可以直接引用,因为session是全局的
login.html
{% extends 'base.html' %}{% block content %} <form method="POST"> {{form.username.label}} {{form.username}}<br><br> {{form.password.label}} {{form.password}}<br><br> <input type="submit" value="登录"><br><br> </form> </body> </html>{% endblock %}
public.html
{% extends 'base.html' %}{% block content %} <body> <h3>这里是公共页面</h3> {% if session.get("admin")%} <a href="{{url_for('AdminUser')}}">进入管理员页面</a> {% else %} <a href="{{url_for('public')}}">点吧,点了还是这个页面</a> {%endif%} </body> </html>{% endblock %}
  1. 如果session.get("admin")值存在,就展示【进入管理员页面】链接,并让链接跳转至AdminUser.html页面
  2. 否则,就展示【点吧,点了还是这个页面】链接,并让链接还跳转至public.html页面
AdminUser.html
{% extends 'base.html' %}{% block content %} <body> <h3>这里是管理员页面</h3> </body> </html>{% endblock %}
一定要实战呀!

以上是关于Session处理实例—Flask网站制作(13)的主要内容,如果未能解决你的问题,请参考以下文章

Flask - Session

1.4 flask request和session

Flask-插件

Flask之Flask-Session -- 2019-08-11 19:38:31

[Python][flask][flask-login]关于flask-login中各种API使用实例

Flask-Session