• flask笔记(二)


    Flask中的路由

    查看整个flask中的路由映射关系 app.url_map

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/index")
    def index()
    	return "flask index page"
    	
    if __name__ == "__main__":
    	print(app.url_map)
    	app.run()
    
    # 下面是打印效果
    '''
    Map([<Rule '/index' (OPTIONS, HEAD, GET) -> index>,
     <Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
    '''
    
    

    打印的效果是一个列表,里面包含着一个一个路由规则,拿出一条解析
    <Rule '/index' (OPTIONS, HEAD, GET) -> index>
    rule : 规则的意思

    '/index' : 这个就是访问的路径,也就是url

    (OPTIONS, HEAD, GET) : 允许的请求方式

    index : 对应的视图函数

    代码块一:
    @app.route("/index")
    def index()
    	return "flask index page"
    

    按照这样的例子来写,我们就实现了一个url和视图函数的对应关系,去看看route()这个方式都做了什么

    代码块二:
    def route(self, rule, **options):
    	def decorator(f):
     		endpoint = options.pop('endpoint', None)
             self.add_url_rule(rule, endpoint, f, **options)
             return f
    	return decorator
    

    首先看这行代码 @app.route("/index")

    route 它是一个方法对吧,那么route("/index") 它加了括号,是不是表示在我们执行falsk程序的时候,就会调用,那它的返回值就应该就是一个函数的内存地址,也就是源码中的decorator函数的内存地址,那么代码块一不是可以更换为这样的形式

    代码块三
    @decorator
    def index():
    	return "flask index page"
    

    继续看这段代码,一个装饰器对吧,会将@decorator下一行的函数(index)的内置地址当作参数传递到函数中,看代码块二中的decorator函数都做了一些什么,decorator函数最终还是返回了参数f,这个参数f就是代码块三中的index函数对吧,那在retuen之前还做了什么呢?也就是这两行代码endpoint = options.pop('endpoint', None) , self.add_url_rule(rule, endpoint, f, **options), 那我们继续分析吧

    endpoint = options.pop('endpoint', None) 这行代码中的options就是一个字典,使用了pop方法,那么这个字典是怎么得到的呢?看代码块二那段源码,有一个**options它和**kwargs是一个意思,是一个字典。那么route这个方法的参数传递方式应该是这样了 route(rule,k1=v1,k2=v2)

    self.add_url_rule(rule, endpoint, f, **options) 这行代码才是最主要的地方,就是这行代码将视图函数和url之前相互对应起来。它的参数我应该不用再细说了,我们看add_url_rule方法做了什么

    算了,源码我就不讲了,有兴趣的话可以自己去阅读下,这个方法主要就是帮我们在url和视图函数之间做了对应关系,那么decorator这个函数也就是代码二,它没有对我们的视图函数做处理,就返回了,也就多执行了add_url_rule这个方法对吧

    # 为创建视图函数和url之间的对应关系的主要代码就是 add_url_rule
    # 那么我们除了代码块一那种方式创建关系,下面这段代码也可以达到效果
    
    from flask import Flask
    
    app = Flask(__name__)
    
    def index()
    	return "flask index page"
    	
    app.add_url_rule("/",view_func=index)
    
    if __name__ == '__main__':
    	app.run()
    # 这样的格式呢,在方法add_url_rule的注释中也提到了
    

    好了,对于通过使用装饰器实现url和视图函数的对应关系的分析就结束了

    我们回到app.url_map的的打印结果来看,里面一个允许求情的方式

    @app.route('/index')
    def index ():
    	return "index page"
    

    这段代码我根本没有指定允许请求的方式,那么它允许的方式默认为GET方式,这时候向这个url发起POST请求,会报错,说该请求方式不允许

    为视图函数设置允许请求方式:app.route('/index',methods=['GET','POST'])methods它是一个列表,请求方法不区分大小写,他会同一为你upper(),

    我们在看decorator这个函数,也就是代码块二中的内容

    def decorator(f):
    	endpoint = options.pop('endpoint', None)
    	self.add_url_rule(rule, endpoint, f, **options)
    	return f
    

    其中有一个这个endpoint , 它代表什么呢?它就是为视图函数命别名,如果你不传的话,那么endpoint的值就是None,最终在add_url_rule 会进行判断endpoint是否为true,不是的话,会将视图函数的__name__ 的值传递给endpoint。最终我们可以通过反向查找endpoint的值去找到对应的url。

    url_for 这个就是反向查找的方法,通过 from flask import url_for去导入,下面写一段代码演示下

    from flask import Flask,url_for,redirect
    
    # redirect是页面重定向的,后面我会继续更新 
    
    app = Flask(__name__)
    
    @app.route("/register",endpoint='register')
    def register():
    	'''访问register之后,重定向到login页面'''
    	url = url_for(login)
    	return redirect(url)
    	
    @app.route('/login',endpoint='login')
    def login():
    	return "login page"
    
    if __name__ == "__main__":
    	app.run()
    
    

    使用endpoint的好处是:不管/login怎么变,使用url_for(login) 就能拿到登陆页面的url。

    看这个url/goods , 这是一个获取商品页面的url,那我想获取某一个商品的页面,这个url怎么设计呢?

    1. ulr?goods_id = 1 这样的方式请求,实现起来很容易
    2. /goods/1 这里的1就是商品的id,那么是多变的对吧,所以必须找到设计出这样的url,/goods/商品的id

    这里需要用到flask提供的转换器:

    default string any path int float uuid 就这几个自带的

    @app.route('/goods/<int:goods_id>',methods=["GET"])
    def goods(goods_id):
    	print(goods_id)
    	return "goods page {}".format(goods_id)
    
    # 注意goods函数必须传递参数,参数名要与转换器后面的值一样,比如这里的goods_id
    # 上面的几个转换器可以去自行了解下,看名字大概就知道怎么使用了
    # 除了flask自带的转换器,我们也可以自定义转换器。
    # 这时别人写的博客,可以去了解:https://www.cnblogs.com/serpent/p/9575179.html
    
  • 相关阅读:
    InstallShield 2010集成.net Framework 4的安装包制作
    linux之稀疏文件
    linux之od命令
    Python多线程
    GCC编译器和GDB调试器常用选项
    Linux GDB Debug
    Linux Core Dump
    linux 通过 ulimit 改善系统性能
    linux的ulimit命令
    字符编码笔记:ASCII,Unicode和UTF-8
  • 原文地址:https://www.cnblogs.com/zhuchunyu/p/10466500.html
Copyright © 2020-2023  润新知