zoukankan      html  css  js  c++  java
  • web技术培训(二)-Flask后端框架初识


    web网站发展至今,特别是服务器端,涉及到的知识、内容,非常广泛。这对程序员的要求会越来越高。如果采用成熟,稳健的框架,那么一些基础的工作,比如,安全性,数据流控制等都可以让框架来处理,那么程序开发人员可以把精力放在具体的业务逻辑上面。 使用框架的优点:
    ·稳定性和可扩展性强
    ·可以降低开发难度,提高开发效率。 在 Python 中常用的 Web 框架有:
        Flask 、Django、Tornado

    Flask简介


    Flask 是一个 Python 实现的 Web 开发微框架。你可以查看:
    1、中文文档 2、英文文档
    Flask 依赖两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集。

    helloworld简单示例


    首先在python中安装Flask框架。
    pip install flask
    
    然后
    # 第一步   导入Flask类
    from flask import Flask
    # 第二步    Flask函数接收一个参数__name__,它会指向程序所在的包
    app = Flask(__name__)
     
    # 第三步   装饰器的作用是将路由映射到视图函数 demo ,并返回 helloworld
    @app.route('/')
    def demo():
        return "helloworld!!"
     
    # 第四步   Flask应用程序实例的 run 方法 启动 WEB 服务器
    if __name__ == '__main__':
        app.run()
    

    相关配置参数


    1、初始化参数

    Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块),接下来就来详细查看一下 Flask 应用程序在创建的时候一些需要我们关注的参数:
    app = Flask(__name__,  # Flask程序所在的包(模块),传 __name__ 就可以 ;其可以决定 Flask 在访问静态文件时查找的路径
                static_path='static',  # 静态文件访问路径(不推荐使用,使用 static_url_path 代替)
                static_url_path='static',  # 静态文件访问路径,可以不传,默认为:/ + static_folder
                static_folder='static',  # 静态文件存储的文件夹,可以不传,默认为 static
                template_folder='templates'  # 模板文件存储的文件夹,可以不传,默认为 templates
                )
    

    2、程序加载配置

    在 Flask 程序运行的时候,可以给 Flask 设置相关配置,比如:配置 Debug 模式,配置数据库连接地址等等,设置 Flask 配置有以下三种方式:
    
    # 第一种   从对象中加载配置
    class Config(object):
        DEBUG = True
    
    app.config.from_object(Config)
    
    # 第二种   从文件中加载配置
    app.config.from_pyfile('config.ini')
     
    # 第三种   从环境变量中加载配置
    app.config.from_envvar('ENVCONFIG')
    

    3、app.run的参数

    可以指定运行的主机IP地址,端口,是否开启调试模式
    app.run(host="0.0.0.0", port=5000, debug = True)
    

    Flask中的路由


    1、指定路由地址

    # 指定访问路径为 demo1
    @app.route('/demo1')
    def demo1():
        return 'demo1'
    

    2、给路由传参示例:有时我们需要将同一类 URL 映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息。

    # 路由传递参数
    @app.route('/user/')
    def user_info(user_id):
        return 'hello %s' % user_id
    
    路由传递的参数默认当做 string 处理,也可以指定参数的类型
    # 路由传递参数
    @app.route('/user/')
    def user_info(user_id):
        return 'hello %d' % user_id
    
    这里指定int,尖括号中的内容是动态的,在此暂时可以理解为接受 int 类型的值,实际上 int 代表使用 IntegerConverter 去处理 url 传入的参数

    3、指定请求方式

    @app.route('/demo2', methods=['GET', 'POST'])
    def demo2():
        # 直接从请求中取到请求方式并返回
        return request.method
    

    视图常用逻辑


    1、返回json

    在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中可以直接使用 jsonify生成一个 JSON 的响应
    # 返回JSON
    @app.route('/demo4')
    def demo4():
        json_dict = {
            "user_id": 10,
            "user_name": "laowang"
        }
        return jsonify(json_dict)
    
    注:不推荐使用 json.dumps 转成 JSON 字符串直接返回,因为返回的数据要符合 HTTP 协议规范,如果是 JSON 需要指定 content-type:application/json

    2、重定向

    重定向到百度网址:
    # 重定向
    @app.route('/demo5')
    def demo5():
        return redirect('http://www.baidu.com')
    
    重定向也可以使用url_for生成指定视图函数所对应的url
    @app.route('/demo1')
    def demo1():
        return 'demo1'
     
    # 重定向
    @app.route('/demo5')
    def demo5():
        return redirect(url_for('demo1'))
    
    重定向可以到带参数的视图函数, 在url_for 函数中传入参数
    # 路由传递参数
    @app.route('/user/')
    def user_info(user_id):
        return 'hello %d' % user_id
     
    # 重定向
    @app.route('/demo5')
    def demo5():
        # 使用 url_for 生成指定视图函数所对应的 url
        return redirect(url_for('user_info', user_id=100))
    

    3、自定义状态码

    在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:status code: 666
    @app.route('/demo6')
    def demo6():
        return '状态码为 666', 666
    
    ......未完待续......
  • 相关阅读:
    30 Day Challenge Day 18 | Leetcode 200. Number of Islands (BFS)
    30 Day Challenge Day 18 | Leetcode 701. Insert into a Binary Search Tree
    30 Day Challenge Day 17 | Leetcode 261. Graph Valid Tree
    30 Day Challenge Day 17 | Leetcode 559. Maximum Depth of N-ary Tree
    30 Day Challenge Day 17 | Leetcode 133. Clone Graph
    30 Day Challenge Day 17 | Leetcode 126. Word Ladder II
    30 Day Challenge Day 17 | Leetcode 489. Robot Room Cleaner
    30 Day Challenge Day 17 | Leetcode 127. Word Ladder
    30 Day Challenge Day 17 | Leetcode 624. Maximum Distance in Arrays
    30 Day Challenge Day 16 | Leetcode 701. Insert into a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/pteromyini/p/12374819.html
Copyright © 2011-2022 走看看