zoukankan      html  css  js  c++  java
  • 初识flask

    Flask设计思路:https://dormousehole.readthedocs.io/en/latest/design.html#design

    1、什么是flask

      Flask 永远不会包含数据库层,也不会有表单库或是这个方面的其它东西。 Flask 本身只是 Werkezug 和 Jinja2 的之间的桥梁,前者实现一个合适的WSGI 应用,后者处理模板。 当然, Flask 也绑定了一些通用的标准库包,比如 logging 。 除此之外其它所有一切都交给扩展来实现。

      为什么呢?因为人们有不同的偏好和需求,Flask 不可能把所有的需求都囊括在核 心里。大多数 web 应用会需要一个模板引擎。然而不是每个应用都需要一个 SQL 数 据库的。

      Flask 使用 Werkzeug 路由系统,该系统是自动根据复杂度来为路由排序的。也就是说你可以以任意顺序来声明路由,路由系统仍然能够正常工作。为什么要实现这个功能?因为当应用被切分成多个模块时,基于路由的装饰器会以乱序触发,所以这个功能是必须的。另一点是 Werkzeug 路由系统必须确保URL是唯一的,并且会把模糊路由重定向到标准的 URL 。

      Flask 原生只使用 Jinja2 模板引擎。模板引擎与编程语言类似,每个引擎都有自己的一套工作方式。表面上它们都看上去 差不多:你把一套变量丢给引擎,然后得到字符串形式的模板。

      但是相似之处也仅限于此。例如 Jinja2 有丰富的过滤系统、有一定的模板继承能力、 支持从模板内或者 Python 代码内复用块(宏)、所有操作都使用 Unicode 、支持 迭代模板渲染以及可配置语法等等。而比如 Genshi 基于 XML 流赋值,其模板继承 基于 XPath 的能力。再如 Mako 使用类似 Python 模块的方式来处理模板。

      当一个应用或者框架与一个模板引擎结合在一起的时候,事情就不只是渲染模板这么 简单了。例如, Flask 使用了 Jinja2 的强大的自动转义功能。同时 Flask 也为 Jinja2 提供了在模板中操作宏的途径。

    一个不失模板引擎独特性的模板抽象层本身就是一门学问,因此这不是一个 Flask 之类的微框架应该考虑的事情。

    2、werkezug简单使用:

    from werkzeug.wrappers import Request, Response
    
    @Request.application
    def index(request):
        return Response("hello world")
    
    
    if __name__ == "__main__":
        from werkzeug.serving import run_simple
        run_simple("localhost", 4000, index)

    3、flask依赖werkezug

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

    4、简单登录实现

    from flask import Flask, render_template, redirect, request, session
    import functools
    
    app = Flask(__name__)
    app.secret_key = "lllasdka"  # session加密时加盐
    
    
    def func(f):
        @functools.wraps(f)
        def inner(*args, **kwargs):
            if not session.get("token"):
                return redirect("/login")
            ret = f(*args, **kwargs)
            return ret
        return inner
    
    
    @app.route('/index')
    @func
    def index():
        return render_template("index.html")
    
    
    @app.route('/login', methods=["GET", "POST"])
    def login():
        if request.method == "GET":
            return render_template("index.html")
        user = request.form.get("user")
        pwd = request.form.get("pwd")
        if user == "aike" and pwd == "666":
            session["token"] = 1
            return "登录成功"
        return render_template("index.html", error="用户名或密码错误")
    
    
    @app.route("/index2")
    @func
    def index2():
        return "ok"
    
    
    if __name__ == '__main__':
        app.run()

     报错一:

    解决方案:设置可通过的请求方式

    @app.route("/login",methods=["GET","POST"])

    报错二:

    解决方法:设置session秘钥

    app.secret_key = "ssssssssss"

    知识点:

      1、werkzeug的简单使用及启动方式

      2、flask的简单使用及启动方式

      3、flask中:

        request的使用方式与django有较大差别,前者通过导入request,后者通过接收request参数

        session的使用,前者通过导入,后者通过request调用。并且需要设置session加密时加盐的值

        路由中默认只有走get请求,若需要走其它请求,需要设置methods参数

      4、装饰器的使用,@functools.wraps(f)装饰器的作用是不改变被装饰函数的调用方式

      

  • 相关阅读:
    .NET Core VS Code 环境配置
    系统架构正交分解法
    面向接口可扩展框架之“Mvc扩展框架及DI”
    发送和接收数据包
    Easticsearch通信方式_API
    Web Api集成Swagger
    NET MVC RazorEngine 解析模板生成静态页
    NET单元测试的艺术
    NET平台机器学习组件-Infer.NET
    ActiveMQ相关背景(转)
  • 原文地址:https://www.cnblogs.com/aizhinong/p/12728777.html
Copyright © 2011-2022 走看看