zoukankan      html  css  js  c++  java
  • flask那些事(一)

    flask配置文件

    flask路由系统

    @app.route() 装饰器中的参数

    如果不明白装饰器 点击这里

    methods : 当前 url 地址,允许访问的请求方式
    @app.route("/info", methods=["GET", "POST"])
    def student_info():
        stu_id = int(request.args["id"])
        return f"Hello Old boy {stu_id}"  # Python3.6的新特性 f"{变量名}"
    
    endpoint : 反向url地址,默认为视图函数名 (url_for)
    from flask import url_for
    
    
    @app.route("/info", methods=["GET", "POST"], endpoint="r_info")
    def student_info():
        print(url_for("r_info"))  # /info
        stu_id = int(request.args["id"])
        return f"Hello Old boy {stu_id}"  # Python3.6的新特性 f"{变量名}"
    
    defaults : 视图函数的参数默认值{"nid":1}
    from flask import url_for
    
    
    @app.route("/info", methods=["GET", "POST"], endpoint="r_info", defaults={"nid": 100})
    def student_info(nid):
        print(url_for("r_info"))  # /info
        # stu_id = int(request.args["id"])
        print(nid)  # 100
        return f"Hello Old boy {nid}"  # Python3.6的新特性 f"{变量名}"
    
    strict_slashes : url地址结尾符"/"的控制 False : 无论结尾 "/" 是否存在均可以访问 , True : 结尾必须不能是 "/"
    # 访问地址 : /info 
    @app.route("/info", strict_slashes=True)
    def student_info():
        return "Hello Old boy info"
    
    
    # 访问地址 : /infos  or  /infos/
    @app.route("/infos", strict_slashes=False)
    def student_infos():
        return "Hello Old boy infos"
    
    redirect_to : url地址重定向
    # 访问地址 : /info 浏览器跳转至 /infos
    @app.route("/info", strict_slashes=True, redirect_to="/infos")
    def student_info():
        return "Hello Old boy info"
    
    @app.route("/infos", strict_slashes=False)
    def student_infos():
        return "Hello Old boy infos"
    
    subdomain : 子域名前缀 subdomian="DragonFire" 这样写可以得到 DragonFire.oldboyedu.com 前提是app.config["SERVER_NAME"] = "oldboyedu.com"
    app.config["SERVER_NAME"] = "oldboy.com"
    
    @app.route("/info",subdomain="DragonFire")
    def student_info():
        return "Hello Old boy info"
    
    # 访问地址为:  DragonFire.oldboy.com/info
    

    关于路由目前就说这么多,之后的课程中会有关于Flask路由系统的源码剖析,再详细说明Flask路由系统的工作原理

    动态参数路由:

    from flask import url_for
    
    
    # 访问地址 : http://127.0.0.1:5000/info/1
    @app.route("/info/<int:nid>", methods=["GET", "POST"], endpoint="r_info")
    def student_info(nid):
        print(url_for("r_info",nid=2))  # /info/2
        return f"Hello Old boy {nid}"  # Python3.6的新特性 f"{变量名}"
    

    int:nid 就是在url后定义一个参数接收

    但是这种动态参数路由,在url_for的时候,一定要将动态参数名+参数值添加进去,否则会抛出参数错误的异常

    路由正则:

    一般不用,如果有特殊需求,不怕麻烦的话,这个东西还是挺好用的,前提是你的正则玩儿的很6

    注意事项以及源码示例:

    • flask的路由系统比较特殊,是通过装饰器实现的,但是究其本质,还是通过 app.add_url_rute 方法来实现的。
    from flask import Flask, request, current_app
    import importlib
    
    app = Flask(__name__)
    
    # 导入配置文件
    app.config.from_object('settings.DevConfig')
    
    # flask路由系统
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    

    路由源码以及其分析

        # 以 @app.route('/index', endpoint='index', methods=['GET']) 为例
        # 函数本质是是个闭包函数
        def route(self, rule, **options):
            # self 表示的app对象的实例
            # rule 表示路由  rule='/index'
            # **options 是其他参数  这里  endpoint='index', methods=['GET']
            def decorator(f):
                # 这里是获取 endpoint的值,如果不存在则为None
                endpoint = options.pop("endpoint", None)
                # 本质上是 执行  app.add_url_rule('/index',....)
                self.add_url_rule(rule, endpoint, f, **options)
                return f
    
            return decorator
        
    """
    第一步 执行route 后返回 decorator
    第二步 执行@decorator -->decorator(index)
    """    
        
    @app.route('/index', endpoint='index', methods=['GET'])  
    # 参数endpoint不写 默认为函数名,用户反向生成url
    def index():
        print(current_app.config['DB'])
        return "xxx"
    
    
    
    def login():
        return 'login'
    
    # 这是另外一种路由方式,类似于django中的path('',views.....)
    app.add_url_rule('/login', 'n2',login,methods=['GET', 'POST'])
    
    
    if __name__ == '__main__':
        app.run()
    
    def _endpoint_from_view_func(view_func):
        """
        Internal helper that returns the default endpoint for a given
        function.  This always is the function name.
        """
        assert view_func is not None, "expected view func if endpoint is not provided."
        # 如果 endpoint=None的时候,返回的是 默认的endpoint view_func的名字
        return view_func.__name__
    

    CBV简单实现

    from flask import Flask, request, current_app,views
    import importlib
    
    app = Flask(__name__)
    
    app.config.from_object('settings.DevConfig')
    
    # 装饰器
    def auth(func):
        def inner(*args,**kwargs):
            result = func(*args,**kwargs)
            return result
        return inner
    
    
    class IndexView(views.MethodView):
        methods = ['GET','POST']
        decorators =[auth,]
        
        def get(self):
            return 'index.get'
        
        def post(self):
            return 'index.post'
    
    app.add_url_rule('/index',view_func=IndexView.as_view(name='index'))  # name=endpoint
    
    if __name__ == '__main__':
        app.run()
    
    

    源码分析

    class MethodView(with_metaclass(MethodViewType, View)):
        """A class-based view that dispatches request methods to the corresponding
        class methods. For example, if you implement a ``get`` method, it will be
        used to handle ``GET`` requests. ::
    
            class CounterAPI(MethodView):
                def get(self):
                    return session.get('counter', 0)
    
                def post(self):
                    session['counter'] = session.get('counter', 0) + 1
                    return 'OK'
    
            app.add_url_rule('/counter', view_func=CounterAPI.as_view('counter'))
        """
    	# 类似于django中的dispatch,视图类中分发不同请求说对应的方法
        def dispatch_request(self, *args, **kwargs):
            meth = getattr(self, request.method.lower(), None)
    
            # If the request method is HEAD and we don't have a handler for it
            # retry with GET.
            if meth is None and request.method == "HEAD":
                meth = getattr(self, "get", None)
    
            assert meth is not None, "Unimplemented method %r" % request.method
            return meth(*args, **kwargs)  
        	# 如果是get请求,返回的是   get(*args,**kwargs)
    

    host文件路径(修改本地DNS对应关系)

    • windows:C:WindowsSystem32driversetchosts

    • mac:/etc/hosts

  • 相关阅读:
    plusOne
    lengthOfLastWord
    maxSubArray
    countAndSay
    学生会管理系统-后端个人总结
    基于图结构实现地铁乘坐线路查询
    地铁线路项目简要分析
    Spring Boot 路由
    Spring Boot 项目配置的使用方法
    IDEA搭建Spring Boot项目
  • 原文地址:https://www.cnblogs.com/qianzhengkai/p/11380601.html
Copyright © 2011-2022 走看看