zoukankan      html  css  js  c++  java
  • Flask web开发 请求拦截和预处理

    我们在开发WEB应用时,往往会需要对所有的url请求进行拦截,做些预处理,比如权限处理、日志等统一处理。

    本文介绍一下Flask中的处理机制。我们通过一个简单的例子来说明。

    1、编写一个简单应用 run.py,内容如下

    from flask import Flask
    from flask import render_template,request,redirect
    
    app = Flask(__name__)
    
    @app.before_request
    def myredirect():
        if not request.path=='/':
            username = request.args.get('username')
            if not username:
                return redirect('/')
            else:
                print 'success'
    
    @app.route('/')
    def hello_world():
        return 'Hello  World!'
    
    
    @app.route('/name')
    def hello_name():
        return 'this is name
    '
    
    @app.route('/show')
    def show():
        return 'this is show 
    '
    
    if __name__ == '__main__':
        app.debug = True
        app.run('0.0.0.0',80)

    上面代码中的关键是
    @app.before_request

    这个标识,flask会将所有的请求交给上面的myredirect()方法处理。

    在这个方法中,判断请求路径是否是  / ,如果是不做任何处理,直接转到 / 对应的方法处理。

    如果不是 / ,则检查url是否带username查询参数, 如果带了,则只是打印下信息,还是交给该url具体的路径处理;否则跳转到 / 请求。

    2、完善前面的案例

    有了前面这个基础,我们可以完善下前面文章《Flask web开发 处理Session》中的遗留问题。

    我们修改 前面文章案例中的 run.py文件,修改后的内容如下:

    from flask import Flask
    from flask import render_template, redirect,url_for
    from flask import request,session
    
    app = Flask(__name__)
    
    @app.before_request
    def before_action():
        print request.path
        if request.path.find('.ico')==-1:
            if not request.path=='/login':
                if not 'username' in session:
                    session['newurl']=request.path
                    return redirect(url_for('login'))
        
    @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():
        return render_template('test.html')
     
    app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
    
    if __name__ == '__main__':
        app.debug = True
        app.run('0.0.0.0',80)

    上面代码增加了一个拦截方法。
    该方法先判断请求是否是普通请求(图片等不做处理,这里是示例,直接写死了只对ico文件不处理,实际有问题)。

    如果是普通请求,判断是否是login 请求。

    如果不是login 请求,再判断session中是否已经有 username(也就是是否已经登录),如果没有则跳转到login页面。

  • 相关阅读:
    I/O模型
    同步异步与协程
    GIL(全局解释器锁)
    解决pycharm启动慢
    操作系统发展史
    TCP和UDP
    粘包问题
    网络编程
    异常
    常用函数汇总
  • 原文地址:https://www.cnblogs.com/51kata/p/5288392.html
Copyright © 2011-2022 走看看