zoukankan      html  css  js  c++  java
  • python-Web-flask-路由和视图

    1 路由和视图:

    简介:

    Flask框架包含两个核心:Werkzeug工具箱,Jinja2模板引擎

    flask: 提供基本功能,属于轻量级

    django: 提供相对完整功能,重量级

    搭建虚拟环境

    Helloworld :

    #1.导入Flask类
    
    from flask import Flask
    
    #2.创建Flask对象接收一个参数__name__,它会指向程序所在的包
    
    app = Flask(__name__)
    
    #3.装饰器的作用是将路由映射到视图函数index
    
    @app.route('/')
    
    def index():
    
        return 'Hello World'
    
    #4.Flask应用程序实例的run方法,启动WEB服务器
    
    if __name__ == '__main__':
    
        app.run()

    相关配置参数:

    初始化参数:

    app = Flask(__name__)
    
    static_url_path静态文件访问路径,默认为:/ + static
    
    static_folder静态文件存储的文件夹,默认为 static
    
    template_folder模板文件存储的文件夹,默认为 templates

    加载参数:

    from flask import Flask
    
    app = Flask(__name__)
    
    # 配置对象,里面定义需要给 APP 添加的一系列配置
    
    class Config(object):
    
        DEBUG = True
    
    app.config.from_object(Config)# 从配置对象中加载配置
    
    #app.config.from_pyfile('config.ini')# 从配置文件中加载配置
    
    #app.config.from_envvar('FLASKCONFIG')# 加载指定环境变量名称所对应的相关配置
    
    @app.route('/')
    
    def index():
    
        return 'Hello World'
    
    if __name__ == '__main__':
    
        app.run(host="0.0.0.0", port=5000, debug = True)

    路由:

    设置路由,路径,参数,请求方式

    # 路由传递参数,整数,get或post方式
    
    @app.route('/user/<int:user_id>',methods=['GET', 'POST'])
    
    def user_info(user_id):
    
        return 'the num is %d' % user_id

    响应:

    # 生成json数据响应体
    
    @app.route('/demo4')
    
    def demo4():
    
        json_dict = {
    
            "user_id": 10,
    
            "user_name": "laowang"
    
        }
    
    return jsonify(json_dict)
    
    # 路由传递参数string
    
    @app.route('/user/<int:user_id>')
    
    def user_info(user_id):
    
        return 'hello %d' % user_id
    
    # 重定向redirect(url_for(‘’,参))
    
    @app.route('/demo5')
    
    def demo5():
    
        # 使用 url_for 生成指定视图函数所对应的 url
    
    return redirect(url_for('user_info', user_id=100))
    
    # 渲染响应render_response(‘’,name=name)

     

    转换器:

    .系统自带转换器

    DEFAULT_CONVERTERS = {

        'default':          UnicodeConverter,

        'string':           UnicodeConverter,

        'any':              AnyConverter,

        'path':             PathConverter,

        'int':              IntegerConverter,

        'float':            FloatConverter,

        'uuid':             UUIDConverter,

    }

    .自定义转换器

    from flask import Flas
    
    k#导入基类转换器
    
    from werkzeug.routing import BaseConverter
    
    app = Flask(__name__)
    
    # 1.自定义类,继承自BaseConverter
    
    class MyRegexConverter(BaseConverter):
    
        # 2.编写初始化方法, init方法, 接收两个参数, url_map, regex, 并初始化父类空间和子类空间
    
        def __init__(self,url_map,regex):
    
            super(MyRegexConverter, self).__init__(url_map)
    
            self.regex = regex
    
    # 3.将自定义转换器类,添加到默认的转换列表中
    
    app.url_map.converters['re'] = MyRegexConverter
    
    #使用自定义转换器#接收3位整数
    
    @app.route('/<re("d{3}"):num>')
    
    def hello_world(num):
    
        print("num = %s"%num)
    
        return "the num is %s"%num
    
    #接收一个手机号
    
    @app.route('/<re("1[345678]d{9}"):mobile>')
    
    def get_phone_number(mobile):
    
        return "the mobile is %s"%mobile
    
    if __name__ == '__main__':
    
        app.run()

    异常捕获:

    from flask import Flask,abort
    
    app = Flask(__name__)
    
    @app.route('/game/<int:age>')
    
    def play_game(age):
    
        #异常抛出
    
        abort(404)
    
        return "helloworld"
    
    #异常捕获
    
    @app.errorhandler(404)
    
    def page_not_found(e):
    
        print(e)
    
        return "找不到服务器资源,服务器搬家了"
    
    if __name__ == '__main__':
    
        app.run()

    钩子:

    请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

    # 在第一次请求之前调用,可以在此方法内部做一些初始化操作
    
    @app.before_first_request
    
    def before_first_request():
    
        print("before_first_request")
    
    # 在每次请求之前调用,直接return之后那么就不会执行视图函数
    
    @app.before_request
    
    def before_request():
    
        print("before_request")
    
    # 在执行完视图函数之后会调用,并且会把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理
    
    @app.after_request
    
    def after_request(response):
    
        print("after_request")
    
        response.headers["Content-Type"] = "application/json"
    
        return response
    
    # 请每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
    
    @app.teardown_request
    
    def teardown_request(e):
    
        print("teardown_request")

     

    Request:

    属性

    说明

    类型

    data

    记录请求的数据,并转换为字符串

    *

    form

    记录请求中的表单数据

    MultiDict

    args

    记录请求中的查询参数

    MultiDict

    cookies

    记录请求中的cookie信息

    Dict

    headers

    记录请求中的报文头

    EnvironHeaders

    method

    记录请求使用的HTTP方法

    GET/POST

    url

    记录请求的URL地址

    string

    files

    记录请求上传的文件

    *

  • 相关阅读:
    循环链表问题
    非常有用的编程学习网站
    我的单例模式(C++)
    C# xml解析
    设计模式趣解
    简单工厂(C++)
    贝塞尔曲线 原理
    C++ 1.#QNAN0;1.#QNAN0
    [NOI2018]屠龙勇士 excrt
    [NOI.AC#30]candy 贪心
  • 原文地址:https://www.cnblogs.com/person1-0-1/p/11400553.html
Copyright © 2011-2022 走看看