• Flask web开发 处理Session


    本文我们在上篇文章《Flask web开发  处理POST请求(登录案例)》的基础上,来讲述Flask对session的支持。

    在上面案例上,我们需要修改和新增如下功能

    1、登录成功后的 url不再是 http://192.168.142.138/home?username=admin

    而是http://192.168.142.138/home

    其中在页面显示的username信息,由模板代码从session中获取

    2、当没有登录之前,在浏览器输入http://192.168.142.138/xxxx 地址,会跳转到http://192.168.142.138/login页面,

    当登录成功后,会进入http://192.168.142.138/xxxx页面。 其中xxx是已经存在的url。

    下面我们来一步步的实现(代码在上个案例基础上改进的,这里不再从头说起):

    1、修改run.py文件,修改后的文件内容如下

    from flask import Flask
    from flask import render_template, redirect,url_for
    from flask import request,session
    
    app = Flask(__name__)
    
    @app.route('/login', methods=['POST','GET'])
    def login():
        error = None
        if request.method == 'POST':
            if request.form['username']=='admin':
                session['username'] = request.form['username']
                return redirect('/home')
            else:
                error = 'Invalid username/password'
        return render_template('login.html', error=error)
    
    @app.route('/home')
    def home():
        return render_template('home.html',username=session['username'])
    
    app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
    
    if __name__ == '__main__':
        app.debug = True
        app.run('0.0.0.0',80)

    修改的内容有:
    1)登录成功,将用户名保留到session中,代码如session['username'] = request.form['username']

    2)登录成功,重定向到home上,不需要带username查询参数

    3)home()方法传入模板的username参数直接从session中使用

    4)为了让session有效,需要设置一个key

    注意:上面的代码有个问题,如果在登录前,直接在浏览器输入home,是会报错的,因为这时session中的username还不存在。这个问题我们在下面会解决。

    因为加了app.debug=true的设置,run.py修改后,服务自动重启。这时我们在浏览器中重新访问,发现 登录成功后的 url不再是 http://192.168.142.138/home?username=admin ,而是http://192.168.142.138/home。 这样文章开头说的第一个问题解决了。

    下面我们来解决第二个问题。

    2、在templates目录下,增加一个test.html文件,内容可以是随意一些文字。

    我们下面要解决的是,当在登录之前在浏览器输入 test.html,会跳转到 login页面,登录成功后会自动跳转到test.html页面。

    3、在run.py中增加一个对test.html的路由,代码如

    @app.route('/test')
    def test():
        return render_template('test.html');

    4、修改run.py文件,修改后的内容如下

    from flask import Flask
    from flask import render_template, redirect,url_for
    from flask import request,session
    
    app = Flask(__name__)
    
    @app.route('/login', methods=['POST','GET'])
    def login():
        error = None
        if request.method == 'POST':
            if request.form['username']=='admin':
                session['username'] = request.form['username']
                if 'newurl' in session:
                    newurl = session['newurl']
            session.pop('newurl', None)
                    return redirect(newurl)
                else:
                    return redirect('/home')
            else:
                error = 'Invalid username/password'
        return render_template('login.html', error=error)
    
    @app.route('/home')
    def home():
        return render_template('home.html',username=session['username'])
    
    @app.route('/test')
    def test():
        if 'username' in session:
            return render_template('test.html')
        else:
            session['newurl']='test'
            return redirect(url_for('login'))
     
    app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
    
    if __name__ == '__main__':
        app.debug = True
        app.run('0.0.0.0',80)

    上面的代码,与前面相比。在test请求的响应处理中,判断session中是否存在username,不存在就跳转到login页面,并把test地址在session中保存。
    然后在login的post请求中,检查newurl是否存在,存在的话表示是由别的页面跳转到登录页面的,这样登录成功后跳转到相应页面,缺省是跳转到home页面。

    这样我们文章开头提的第2个问题看上去也解决了。为什么说看上去呢? 因为实际是有问题的。 我们这个是对test请求做了特殊处理。我们应该能对所有的请求(包括还存在问题的home请求)做拦截,判断是否登录,如果没登录,就跳转到登录页面。

    这个问题我们在后续的文章中处理,处理的核心思路是在请求达到每个具体的路由代码之前,能进行拦截和判断是否登录。

  • 相关阅读:
    Servlet监听器及在线用户
    数据分页jdbc+mysql实现
    使用ajax验证用户名重复
    Mysql中的事务
    用户登录注册案例分析
    Java连接mysql数据库
    Java连接sqlite数据库
    虚拟主机TOMCAT配置
    用jquery控制表格奇偶行及活动行颜色
    JDK安装后 没有tools.jar 和dt.jar包的解决办法
  • 原文地址:https://www.cnblogs.com/51kata/p/5286852.html
Copyright © 2020-2023  润新知