Flask中的路由

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

  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route("/index")
  4. def index()
  5. return "flask index page"
  6. if __name__ == "__main__":
  7. print(app.url_map)
  8. app.run()
  9. # 下面是打印效果
  10. '''
  11. Map([<Rule '/index' (OPTIONS, HEAD, GET) -> index>,
  12. <Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])
  13. '''

打印的效果是一个列表,里面包含着一个一个路由规则,拿出一条解析

<Rule '/index' (OPTIONS, HEAD, GET) -> index>

rule : 规则的意思

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

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

index : 对应的视图函数

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

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

  1. 代码块二:
  2. def route(self, rule, **options):
  3. def decorator(f):
  4. endpoint = options.pop('endpoint', None)
  5. self.add_url_rule(rule, endpoint, f, **options)
  6. return f
  7. return decorator

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

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

  1. 代码块三
  2. @decorator
  3. def index():
  4. 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这个方法对吧

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

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

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

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

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

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

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

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

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

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

  1. from flask import Flask,url_for,redirect
  2. # redirect是页面重定向的,后面我会继续更新
  3. app = Flask(__name__)
  4. @app.route("/register",endpoint='register')
  5. def register():
  6. '''访问register之后,重定向到login页面'''
  7. url = url_for(login)
  8. return redirect(url)
  9. @app.route('/login',endpoint='login')
  10. def login():
  11. return "login page"
  12. if __name__ == "__main__":
  13. 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 就这几个自带的

  1. @app.route('/goods/<int:goods_id>',methods=["GET"])
  2. def goods(goods_id):
  3. print(goods_id)
  4. return "goods page {}".format(goods_id)
  5. # 注意goods函数必须传递参数,参数名要与转换器后面的值一样,比如这里的goods_id
  6. # 上面的几个转换器可以去自行了解下,看名字大概就知道怎么使用了
  7. # 除了flask自带的转换器,我们也可以自定义转换器。
  8. # 这时别人写的博客,可以去了解:https://www.cnblogs.com/serpent/p/9575179.html

flask笔记(二)的更多相关文章

  1. flask笔记二

    web表单 web表单是浏览者和网之间的一个互动平台,完成浏览器和服务器之间的数据交互. 1.用Flask-WTF来处理表单 (1)在根目录下编辑扩展配置--config.py CSRF_ENABLE ...

  2. flask笔记(三)Flask 添加登陆验证装饰器报错,及解析

    Flask 添加登陆验证装饰器报错,及解析 写这个之前,是想到一个需求,这个是关于之前写Flask笔记(二)中的一个知识点,路由相关 需求为 : 有一些页面必须是登陆之后才能访问的,比如Shoppin ...

  3. Flask笔记1

    Flask笔记 首先明确一下,要运行一个动态网页,我们需要 一个 Web 服务器来监听并响应请求,如果请求的是静态文件它就直接将其返回,如果是动态 url 它就将请求转交给 Web 应用. 一个 We ...

  4. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  5. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  6. Flask备注二(Configurations, Signals)

    Flask备注二(Configuration, Signals) Flask是一个使用python开发Web程序的框架.依赖于Werkzeug提供完整的WSGI支持,以及Jinja2提供templat ...

  7. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  8. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  9. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

随机推荐

  1. PAT 1051 Pop Sequence

    #include <cstdio> #include <cstdlib> #include <vector> using namespace std; bool p ...

  2. git 创建远程版本库(亲测有效)

    一.github远程版本库 1.创建SSH Key(windows)   ssh-keygen -t rsa -C "youremail@example.com"   2.连接版本 ...

  3. CSS动画效果

    CSS变形效果 Transform translate:平移 translate(x,y) translateX(x) translateY(y)相对于元素原始位置平移. scale:缩放 大于1放大 ...

  4. Stage5--Python GUI编程TKinter

    Python图形库简要介绍 python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准 ...

  5. CKRule业务规则管理系统部署说明

    1.   程序包说明 软件是使用WinForm开发的,包含服务端和客户端,服务端部署在IIS上面,客户端可以在已经安装.Net4.0的windows上面运行. 1.1.  服务端程序包 CKBrmsS ...

  6. java:网络通讯

    网络标准模型:开放式系统模型OSI https://www.cnblogs.com/lydit/articles/4499928.html 理解Scoket通讯:https://www.cnblogs ...

  7. SQL Server ->> DISABLE索引后插入更新数据再REBUILD索引 和 保留索引直接插入更新数据的性能差异

    之前对于“DISABLE索引后插入更新数据再REBUILD索引 和 保留索引直接插入更新数据的性能差异”这两种方法一直认为其实应该差不多,因为无论如何索引最后都需要被维护,只不过是个时间顺序先后的问题 ...

  8. 对synchronized(this)的一些理解

    一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. ...

  9. web Worker基本使用

    web worker 使用 web worker 是现代浏览器具有的可以处理密集型任务非常便利的解决方案,众所周知,JavaScript是单线程的(一个JavaScript引擎实例只能占用一个线程,线 ...

  10. Python新式类 单例模式与作用域(四)

    1 新式类与旧式类 新式类拥有经典类的全部特性之外,还有一些新的特性,比如 __init__发生变化,新增了静态方法__new__,python3目前都采用新式类,新式类是广度优先,旧式类是深度优先 ...