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怎么设计呢?
- ulr?goods_id = 1 这样的方式请求,实现起来很容易
- /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
flask笔记(二)的更多相关文章
- flask笔记二
web表单 web表单是浏览者和网之间的一个互动平台,完成浏览器和服务器之间的数据交互. 1.用Flask-WTF来处理表单 (1)在根目录下编辑扩展配置--config.py CSRF_ENABLE ...
- flask笔记(三)Flask 添加登陆验证装饰器报错,及解析
Flask 添加登陆验证装饰器报错,及解析 写这个之前,是想到一个需求,这个是关于之前写Flask笔记(二)中的一个知识点,路由相关 需求为 : 有一些页面必须是登陆之后才能访问的,比如Shoppin ...
- Flask笔记1
Flask笔记 首先明确一下,要运行一个动态网页,我们需要 一个 Web 服务器来监听并响应请求,如果请求的是静态文件它就直接将其返回,如果是动态 url 它就将请求转交给 Web 应用. 一个 We ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}
笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...
- Flask备注二(Configurations, Signals)
Flask备注二(Configuration, Signals) Flask是一个使用python开发Web程序的框架.依赖于Werkzeug提供完整的WSGI支持,以及Jinja2提供templat ...
- Mastering Web Application Development with AngularJS 读书笔记(二)
第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...
- Python 学习笔记二
笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
随机推荐
- SpringSecurity 3.2入门(3)单用户登录
1.增加web.xml文件配置如下 <!-- 获取Spring Security session的生命周期,这个监听器会在 session 创建和销毁的时候通知 Spring Security ...
- 三种ajax解析模式!
一.Ajax中的JSON格式 html代码: <html> <body> <input type="button" value="Ajax& ...
- 04.Continue,和三元表达式的学习
立即结束本次循环,判断循环条件,如果成立,则进入下一次循环,否则退出循环. 举例:运动员跑步喝水的例子 比如:我编写代码的时候,上个厕所,回来继续写代码 练习1: namespace _09.练习02 ...
- Windows10 iis10 arr webfarm
win10安装arr提示安装失败,但是安装说明中提升iis7及以上版本,iis10却安装失败,坑爹!安装方法: 1.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe ...
- ireport 导出excel 分页 和 文本转数字格式的解决方法
景:ireport 画excel 报表,导出时要求 数据分页,每页包含 标题和页脚 1.画excel 2.处理分页 首先建立一个变量totalNum 用于记录总共有多少条记录,注意设置属性为Integ ...
- 洛谷P1966 火柴排队(逆序对)
题意 题目链接 Sol 不算很难的一道题 首先要保证权值最小,不难想到一种贪心策略,即把两个序列中rank相同的数放到同一个位置 证明也比较trivial.假设\(A\)中有两个元素\(a, b\), ...
- phpmyadmin杂记
看着坑爹的教程..我老是报错我也很无奈啊 以下几项必改 $cfg['blowfish_secret'] = ' ';//这里引号内是空格,实际上可以是任意内容, $cfg['Servers'][$i] ...
- Zepto和Jquery区别
---恢复内容开始--- <zepto移动端事件> 1.$("#xx").tap(function(){ //tap在屏幕点击时触发 alert("sssss ...
- 【转】 ASP.NET使用ICallbackEventHandler无刷新验证用户名是否可用
功能说明:当用户在用户名输入框输入字符并焦点离开此输入框时,自动到数据库用户表中验证此用户名是否已被注册,如果已被注册,显示[不可用],反之,显示[可用],期间页面不刷新,读者也可以考虑将提示文字换成 ...
- Centos7安装JDK1.8 Linux64bit
流程一览: 1.下载JDK1.8(jdk-8u11-linux-x64.tar.gz) 2. 解压缩安装 3.配置JAVA_HOME环境变量 4.切换JDK1.8为当前使用的JDK 5.重启,查看安装 ...