zoukankan      html  css  js  c++  java
  • Flask

    简介

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

    “微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

    默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。

    基本使用

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        app.run()  

    路由系统

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    __author__ = 'Wu'
    
    from flask import Flask
    
    app = Flask(__name__)
    
    
    
    # @app.route('/index')
    def index():
        return 'Index'
    
    
    def login():
        return 'Login'
    
    
    app.add_url_rule('/index', 'index', index, methods=['GET'])
    app.add_url_rule('/login', 'login', login, methods=['GET'])
    
    if __name__ == '__main__':
        app.run()
    

    源码实现: 

    def _endpoint_from_view_func(view_func):
        
        assert view_func is not None, 'expected view func if endpoint ' 'is not provided.'
        return view_func.__name__  # endpoint等于视图函数的名字
    
    def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
        if endpoint is None:    # 2. 如果endpoint为None
    
            endpoint = _endpoint_from_view_func(view_func)  # 3. endpoint等于。。。
        options['endpoint'] = endpoint
        methods = options.pop('methods', None)
    
    def route(self, rule, **options):
        def decorator(f):
            endpoint = options.pop('endpoint', None)  # 1.如果不设置endpoint则为None
            self.add_url_rule(rule, endpoint, f, **options)  # flask路由的本质就是调用self.add_url_rule
            return f
    
        return decorator
    

    CBV

    Django中处理请求的方式有FBV和CBV两中,其实Flask中也支持CBV,它的CBV和Django的类似。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    __author__ = 'Wu'
     
    from flask import Flask, views
     
    app = Flask(__name__)
     
     
    def auth(func):
        def inner(*args, **kwargs):
            print('Before')
            result = func(*args, **kwargs)
            print('After')
            return result
        return inner
     
     
    class LoginView(views.MethodView):
        methods = ['GET', 'POST']
        decorators = [auth, ]  # 装饰器
     
        def get(self):
            return 'CBV GET'
     
        def post(self):
            return 'CBV POST'
     
     
    app.add_url_rule('/login', view_func=LoginView.as_view(name='login'))  # name=endpoint
     
     
    if __name__ == '__main__':
        app.run()
    View Code 

    请求扩展

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    __author__ = 'Wu'
    
    from flask import Flask, Request, render_template
     
    app = Flask(__name__, template_folder='templates')
    app.debug = True
     
     
    @app.before_first_request
    def before_first_request1():
        print('before_first_request1')
     
     
    @app.before_first_request
    def before_first_request2():
        print('before_first_request2')
     
     
    @app.before_request
    def before_request1():
        Request.nnn = 123
        print('before_request1')
     
     
    @app.before_request
    def before_request2():
        print('before_request2')
     
     
    @app.after_request
    def after_request1(response):
        print('before_request1', response)
        return response
     
     
    @app.after_request
    def after_request2(response):
        print('before_request2', response)
        return response
     
     
    @app.errorhandler(404)
    def page_not_found(error):
        return 'This page does not exist', 404
     
     
    @app.template_global()
    def sb(a1, a2):
        return a1 + a2
     
     
    @app.template_filter()
    def db(a1, a2, a3):
        return a1 + a2 + a3
     
     
    @app.route('/')
    def hello_world():
        return render_template('hello.html')
     
     
    if __name__ == '__main__':
        app.run()
    View Code

    基于请求扩展实现session认证

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    __author__ = 'Wu'
    
    from flask import Flask, render_template, request, redirect, session
     
    app = Flask(__name__)
    app.debug = True
    app.secret_key = 'df$d5!5fe-43'
     
     
    @app.before_request
    def process_request():
        if request.path == '/login':
            return None
        user = session.get('user')
        if not user:
            return redirect('/login')
     
     
    @app.route('/index')
    def index():
     
        return render_template('index.html')
     
     
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'GET':
            return render_template('login.html')
     
        else:
            username = request.form.get('username')
            password = request.form.get('password')
            if username == 'test' and password == '123456':
                session['user'] = username
                return redirect('/index')
            else:
                return '用户名或密码错误'
     
     
    if __name__ == '__main__':
        app.run()
    View Code
  • 相关阅读:
    11111 Generalized Matrioshkas
    Uva 442 Matrix Chain Multiplication
    Uva 10815 Andy's First Dictionary
    Uva 537 Artificial Intelligence?
    Uva 340 MasterMind Hints
    SCAU 9508 诸葛给我牌(水泥题)
    Uva 10420 List of Conquests(排序水题)
    Uva 409 Excuses, Excuses!
    10/26
    11/2
  • 原文地址:https://www.cnblogs.com/qq2233297039/p/8613190.html
Copyright © 2011-2022 走看看